Протокол обмена ЕГАИС / Форма запрос ответ / Модуль формы

файл

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

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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
	
	ЗаполнитьСтраницыСессийОбмена();
	
КонецПроцедуры

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

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

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

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

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

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

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

	СтраницаТекстXML  = ДобавитьСтраницу("СтраницаТекстXML",  НСтр("ru = 'Текст XML'"),  ВложенныеСтраницы, Идентификатор);
	СтраницаПрочее    = ДобавитьСтраницу("СтраницаПрочее",    НСтр("ru = 'Прочее'"),     ВложенныеСтраницы, Идентификатор);
	
	Тексты = ТекстыСообщения(СтрокаТЧ.Сообщение);
	
	ДобавитьПолеТекстовогоДокумента("ТекстXML",  Тексты.XML, СтраницаТекстXML, Идентификатор);
	
	РеквизитыСообщения = РеквизитыСообщений.Найти(СтрокаТЧ.Сообщение, "Ссылка");
	
	ДобавитьПолеВвода("Сообщение",    НСтр("ru = 'Сообщение'"),     РеквизитыСообщения.Ссылка,       СтраницаПрочее, Идентификатор);
	ДобавитьПолеВвода("ДатаСоздания", НСтр("ru = 'Дата создания'"), РеквизитыСообщения.ДатаСоздания, СтраницаПрочее, Идентификатор);
	
КонецПроцедуры

&НаСервере
Функция АнализСообщенийПередачиДанных(Сообщение, Операция = Неопределено)
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	ЕГАИСПрисоединенныеФайлы.Документ           КАК Документ,
	|	ЕГАИСПрисоединенныеФайлы.Ссылка             КАК Ссылка,
	|	ЕГАИСПрисоединенныеФайлы.ТипСообщения       КАК ТипСообщения,
	|	ЕГАИСПрисоединенныеФайлы.Операция           КАК Операция,
	|	ЕГАИСПрисоединенныеФайлы.СообщениеОснование КАК СообщениеОснование,
	|	ЕГАИСПрисоединенныеФайлы.СтатусОбработки    КАК СтатусОбработки,
	|	ЕГАИСПрисоединенныеФайлы.ДатаСоздания       КАК ДатаСоздания
	|ПОМЕСТИТЬ Сообщения
	|ИЗ
	|	Справочник.ЕГАИСПрисоединенныеФайлы КАК ЕГАИСПрисоединенныеФайлы
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ЕГАИСПрисоединенныеФайлы КАК ФайлОснование
	|		ПО ФайлОснование.Документ = ЕГАИСПрисоединенныеФайлы.Документ
	|ГДЕ
	|	ФайлОснование.Ссылка = &ФайлОснование
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	Сообщения.Документ                                          КАК Документ,
	|
	|	Сообщения.Ссылка                                            КАК Запрос,
	|	Сообщения.Операция                                          КАК ЗапросОперация,
	|	Сообщения.ТипСообщения                                      КАК ЗапросТипСообщения,
	|	Сообщения.ДатаСоздания                                      КАК ЗапросДатаСоздания,
	|
	|	ЕСТЬNULL(ОтветНаПередачуДанных.Ссылка, &ПустаяСсылка)            КАК ОтветНаЗапрос,
	|	ЕСТЬNULL(ОтветНаПередачуДанных.Операция, &ПустаяОперация)        КАК ОтветНаЗапросОперация,
	|	ЕСТЬNULL(ОтветНаПередачуДанных.ДатаСоздания, ДатаВремя(1,1,1))   КАК ОтветНаЗапросДатаСоздания,
	|	ЕСТЬNULL(ОтветНаПередачуДанных.ТипСообщения, Неопределено)       КАК ОтветНаЗапросТипСообщения,
	|	ЕСТЬNULL(ОтветНаПередачуДанных.СтатусОбработки, Неопределено)    КАК ОтветНаЗапросСтатусОбработки,
	|
	|	ЕСТЬNULL(КвитанцияПолученЕГАИС.Ссылка, &ПустаяСсылка)            КАК КвитанцияПолученЕГАИС,
	|	ЕСТЬNULL(КвитанцияПолученЕГАИС.Операция, &ПустаяОперация)        КАК КвитанцияПолученЕГАИСОперация,
	|	ЕСТЬNULL(КвитанцияПолученЕГАИС.ДатаСоздания, ДатаВремя(1,1,1))   КАК КвитанцияПолученЕГАИСДатаСоздания,
	|	ЕСТЬNULL(КвитанцияПолученЕГАИС.ТипСообщения, Неопределено)       КАК КвитанцияПолученЕГАИСТипСообщения,
	|	ЕСТЬNULL(КвитанцияПолученЕГАИС.СтатусОбработки, Неопределено)    КАК КвитанцияПолученЕГАИССостояниеОбработки,
	|
	|	ЕСТЬNULL(КвитанцияПроведенЕГАИС.Ссылка, &ПустаяСсылка)           КАК КвитанцияПроведенЕГАИС,
	|	ЕСТЬNULL(КвитанцияПроведенЕГАИС.Операция, &ПустаяОперация)       КАК КвитанцияПроведенЕГАИСОперация,
	|	ЕСТЬNULL(КвитанцияПроведенЕГАИС.ДатаСоздания, ДатаВремя(1,1,1))  КАК КвитанцияПроведенЕГАИСДатаСоздания,
	|	ЕСТЬNULL(КвитанцияПроведенЕГАИС.ТипСообщения, Неопределено)      КАК КвитанцияПроведенЕГАИСТипСообщения,
	|	ЕСТЬNULL(КвитанцияПроведенЕГАИС.СтатусОбработки, Неопределено)   КАК КвитанцияПроведенЕГАИССостояниеОбработки
	|ИЗ
	|	Сообщения КАК Сообщения
	|		
	|		ЛЕВОЕ СОЕДИНЕНИЕ Сообщения КАК ОтветНаПередачуДанных
	|		ПО Сообщения.Ссылка = ОтветНаПередачуДанных.СообщениеОснование
	|		И (Сообщения.Операция = ОтветНаПередачуДанных.Операция)
	|		И (ОтветНаПередачуДанных.ТипСообщения = ЗНАЧЕНИЕ(Перечисление.ТипыЗапросовИС.Входящий))
	|		
	|		ЛЕВОЕ СОЕДИНЕНИЕ Сообщения КАК КвитанцияПолученЕГАИС
	|		ПО Сообщения.Ссылка = КвитанцияПолученЕГАИС.СообщениеОснование
	|		И (КвитанцияПолученЕГАИС.ТипСообщения = ЗНАЧЕНИЕ(Перечисление.ТипыЗапросовИС.Входящий))
	|		И (КвитанцияПолученЕГАИС.Операция В(&КвитанцияПолученЕГАИС))
	|		
	|		ЛЕВОЕ СОЕДИНЕНИЕ Сообщения КАК КвитанцияПроведенЕГАИС
	|		ПО Сообщения.Ссылка = КвитанцияПроведенЕГАИС.СообщениеОснование
	|		И (КвитанцияПроведенЕГАИС.ТипСообщения = ЗНАЧЕНИЕ(Перечисление.ТипыЗапросовИС.Входящий))
	|		И (КвитанцияПроведенЕГАИС.Операция В(&КвитанцияПроведенЕГАИС))
	|ГДЕ
	|	Сообщения.СообщениеОснование = &ПустаяСсылка
	|	И ( ЕСТЬNULL(Сообщения.Ссылка, &ПустаяСсылка)               = &ФайлОснование
	|	ИЛИ ЕСТЬNULL(ОтветНаПередачуДанных.Ссылка,   &ПустаяСсылка) = &ФайлОснование
	|	ИЛИ ЕСТЬNULL(КвитанцияПолученЕГАИС.Ссылка,   &ПустаяСсылка) = &ФайлОснование
	|	ИЛИ ЕСТЬNULL(КвитанцияПроведенЕГАИС.Ссылка,  &ПустаяСсылка) = &ФайлОснование)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	*
	|ИЗ
	|	Сообщения
	|");
	
	Запрос.УстановитьПараметр("КвитанцияПроведенЕГАИС", Перечисления.ВидыДокументовЕГАИС.КвитанцияПроведенЕГАИС);
	Запрос.УстановитьПараметр("КвитанцияПолученЕГАИС",  Перечисления.ВидыДокументовЕГАИС.КвитанцияПолученЕГАИС);
	
	Запрос.УстановитьПараметр("ФайлОснование",  Сообщение);
	Запрос.УстановитьПараметр("ПустаяОперация", Перечисления.ВидыДокументовЕГАИС.ПустаяСсылка());
	Запрос.УстановитьПараметр("ПустаяСсылка",   Справочники.ЕГАИСПрисоединенныеФайлы.ПустаяСсылка());
	
	Результат = Запрос.ВыполнитьПакет();
	
	ВозвращаемоеЗначение = Новый Структура;
	ВозвращаемоеЗначение.Вставить("ПоследовательностьСообщений", ПоследовательностьСообщенийПередачиДанных(Результат[1].Выгрузить()));
	ВозвращаемоеЗначение.Вставить("РеквизитыСообщений",          Результат[2].Выгрузить());
	
	Возврат ВозвращаемоеЗначение;
	
КонецФункции

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

&НаСервере
Процедура ЗаполнитьСтраницыСессийОбмена()
	
	Результат = АнализСообщенийПередачиДанных(Объект.Ссылка);

	ДобавляемыеРеквизиты = Новый Массив;
	УдаляемыеРеквизиты = Новый Массив;
	
	РеквизитыФормы = ПолучитьРеквизиты();
	Для Каждого Реквизит Из РеквизитыФормы Цикл
		Если Реквизит.Имя <> "Объект" Тогда
			УдаляемыеРеквизиты.Добавить(Реквизит.Имя);
		КонецЕсли;
	КонецЦикла;
	
	Если УдаляемыеРеквизиты.Количество() > 0 Тогда
		ИзменитьРеквизиты(, УдаляемыеРеквизиты);
	КонецЕсли;
	
	Для Каждого СтрокаТЧ Из Результат.ПоследовательностьСообщений Цикл
		ДобавлениеРеквизитов(СтрокаТЧ.Сообщение, ДобавляемыеРеквизиты);
	КонецЦикла;
	
	ИзменитьРеквизиты(ДобавляемыеРеквизиты);
	
	Для Каждого СтрокаТЧ Из Результат.ПоследовательностьСообщений Цикл
		ДобавлениеЭлементов(СтрокаТЧ, Результат.РеквизитыСообщений);
	КонецЦикла;
	
	ИдентификаторПоследнейСтраницы = СтрЗаменить(Результат.ПоследовательностьСообщений[Результат.ПоследовательностьСообщений.Количество() - 1].Сообщение.УникальныйИдентификатор(), "-", "");
	ПоследняяСтраница = Элементы.Найти("Страница" + ИдентификаторПоследнейСтраницы);
	Элементы.Страницы.ТекущаяСтраница = ПоследняяСтраница;
	
КонецПроцедуры

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

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

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