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

файл
&НаСервере
Перем КонтекстЭДО;

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

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

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)

	Если ЗначениеЗаполнено(ТекстПредупреждения) Тогда 
		ПоказатьПредупреждение(, ТекстПредупреждения);
		Отказ = Истина;
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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