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

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

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

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

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

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

&НаКлиенте
Процедура ПослеПолученияКонтекстаЭДО(ВхКонтекст, ДопПараметры) Экспорт
	
	Если ВхКонтекст.КонтекстЭДО <> Неопределено Тогда 
		КонтекстЭДО = ВхКонтекст.КонтекстЭДО;
	КонецЕсли;
	
КонецПроцедуры
	
#КонецОбласти

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

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

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

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

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

&НаСервере
Функция УбратьТочкуВКонце(Знач Сообщение)
	Сообщение = СокрП(Сообщение);
	Пока Прав(Сообщение, 1) = "." Цикл 
		Сообщение = Сред(Сообщение, 1, СтрДлина(Сообщение) - 1);
	КонецЦикла;
	Возврат Сообщение;
КонецФункции

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

КонецПроцедуры 

&НаСервере
Процедура СформироватьДеревоОшибокПоОрганизациям(ДеревоОшибок, Организации, Ошибки)

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

	Элементы.ОшибкиПоОрганизациям.Отображение = ОтображениеТаблицы.Список;
	
КонецПроцедуры

&НаСервере
Процедура СформироватьДеревоОшибокПлоско(ДеревоОшибок, Ошибки)

	Корень = ДеревоОшибок.Строки;
	Для каждого Ошибка Из Ошибки Цикл
		УровеньОшибки = Корень.Добавить();
		УровеньОшибки.ОписаниеОшибки = Ошибка.ОписаниеОшибки;
		Если ЗначениеЗаполнено(Ошибка.Контекст) Тогда 
			УровеньОшибки.ДанныеКонтекста = Ошибка.Контекст;
			УровеньОшибки.ОписаниеОшибкиСсылка = УровеньОшибки.ОписаниеОшибки;
			УровеньОшибки.ИспользоватьКолонкуСсылки = Истина;			
		КонецЕсли;
	КонецЦикла; 

	Элементы.ОшибкиПоОрганизациям.Отображение = ОтображениеТаблицы.Список;
	
КонецПроцедуры

&НаСервере
Процедура ВывестиНадписьПроОшибки(МассивОшибок)

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

КонецПроцедуры

&НаСервереБезКонтекста
Функция ИмяРеквизитаДанныхРекомендацийСЭДО()
	
	Возврат "РекомендацияСЭДО_ДанныеОшибок";
	
КонецФункции

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

#Область ПереключениеНаОбменЧерезОператораСЭДО

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

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

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

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