Загрузка отчета банка по эквайрингу / Модуль менеджера

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

// Процедура загружает XML файл в информационную базу.
//
// Параметры:
//    Объект - ЛюбаяСсылка - Не используется
//    XMLФайл - ЛюбаяСсылка - Не используется
//    ПроводитьДокументыПриЗагрузке - Булево - Признак необходимости проведения документов при загрузке в ИБ
//    Адрес - Строка - Адрес во временном хранилище.
//
Процедура ЗагрузитьXMLФайлВИнформационнуюБазуСервер(Объект, XMLФайл, ПроводитьДокументыПриЗагрузке, Адрес) Экспорт
	
	ДеревоЗначенийXMLФайл = Новый ДеревоЗначений;
	ДеревоЗначенийXMLФайл.Колонки.Добавить("ИмяЭлемента");
	ДеревоЗначенийXMLФайл.Колонки.Добавить("ЗначениеЭлемента");
	
	Если ПрочитатьXMLФайлВДеревоЗначений(Объект, XMLФайл, ДеревоЗначенийXMLФайл, Адрес) Тогда
		Если ДеревоЗначенийXMLФайл.Строки.Количество() > 0 Тогда
			Если ДеревоЗначенийXMLФайл.Строки.Найти("СтрокаПоМерчанту", "ИмяЭлемента", Истина) = Неопределено Тогда
				
				ОбщегоНазначения.СообщитьПользователю(НСтр("ru='В файле с данными не найден элемент с наименованием ""СтрокаПоМерчанту"".
					|Формат выбранного файла не соответствует поддерживаемому формату.'"), , "XMLФайл");
			Иначе
				ЗагрузитьXMLФайлИзДереваЗначенийВИнформационнуюБазу(ДеревоЗначенийXMLФайл.Строки, ПроводитьДокументыПриЗагрузке);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

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

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

#Область Прочее

Процедура СоздатьДокументОтчетБанкаПоОперациямЭквайринга(Элементы, НомерОтчета, ПроводитьДокументыПриЗагрузке, АтрибутыЭлементаДанныеПоЗапросу)
	
	НомерСтрокиПоТерминалу = 0;
	
	Запрос = Новый Запрос("
	|ВЫБРАТЬ
	|	ЭквайринговыеТерминалы.Владелец.Ссылка КАК ДоговорЭквайринга,
	|	ЭквайринговыеТерминалы.Ссылка КАК ЭквайринговыйТерминал,
	|	ЭквайринговыеТерминалы.Владелец.Организация КАК Организация,
	|	ЭквайринговыеТерминалы.Владелец.Организация.ИНН КАК ИННОрганизации,
	|	ЭквайринговыеТерминалы.Владелец.БанковскийСчет.ВалютаДенежныхСредств КАК Валюта,
	|	ЕСТЬNULL(ЭквайринговыеТерминалы.Владелец.БанковскийСчет.Банк.Код, ЭквайринговыеТерминалы.Владелец.БанковскийСчет.БИКБанка) КАК БИКБанка,
	|	ЭквайринговыеТерминалы.Владелец.БанковскийСчет.НомерСчета КАК НомерСчетаБанка,
	|	ЭквайринговыеТерминалы.Владелец.СтатьяРасходов КАК СтатьяРасходов,
	|	ЭквайринговыеТерминалы.Владелец.АналитикаРасходов КАК АналитикаРасходов,
	|	ЭквайринговыеТерминалы.Владелец.ПодразделениеРасходов КАК Подразделение,
	|	ЭквайринговыеТерминалы.Владелец.СпособОтраженияКомиссии = ЗНАЧЕНИЕ(Перечисление.СпособыОтраженияЭквайринговойКомиссии.ВОтчете) КАК ОтражатьКОмиссию,
	|	ЭквайринговыеТерминалы.Владелец.ДетальнаяСверкаТранзакций КАК ДетальнаяСверкаТранзакций
	|ИЗ
	|	Справочник.ЭквайринговыеТерминалы КАК ЭквайринговыеТерминалы
	|ГДЕ
	|	ЭквайринговыеТерминалы.Код = &Код
	|");
	
	Если ПроводитьДокументыПриЗагрузке Тогда
		РежимЗаписиДок = РежимЗаписиДокумента.Проведение;
	Иначе
		РежимЗаписиДок = РежимЗаписиДокумента.Запись;
	КонецЕсли;
	
	ДокументОбъект = ОтчетБанкаПоЭквайрингу(АтрибутыЭлементаДанныеПоЗапросу);
	ДокументОбъект.Покупки.Очистить();
	ДокументОбъект.Возвраты.Очистить();
	
	СуммаКомиссии = 0;
	
	Для Каждого Элемент Из Элементы Цикл
		
		Если Элемент.ИмяЭлемента = "Дата" Тогда
			
			Попытка
				
				Если КонецДня(СтрЗаменить(Элемент.ЗначениеЭлемента, "-", "")) = КонецДня(ТекущаяДатаСеанса()) Тогда
					
					ДокументОбъект.Дата =
						СтрЗаменить(Элемент.ЗначениеЭлемента, "-", "") +
						Формат(Час(ТекущаяДатаСеанса()), "ЧЦ=2; ЧВН=") +
						Формат(Минута(ТекущаяДатаСеанса()), "ЧЦ=2; ЧВН=") +
						Формат(Секунда(ТекущаяДатаСеанса()), "ЧЦ=2; ЧВН=");
				Иначе
					ДокументОбъект.Дата = СтрЗаменить(Элемент.ЗначениеЭлемента, "-", "") + "120000";
				КонецЕсли;
				
			Исключение
				ДокументОбъект.Дата = Неопределено;
			КонецПопытки;
			
		ИначеЕсли Элемент.ИмяЭлемента = "НомерМерчанта" Тогда
			
			Если ЗначениеЗаполнено(Элемент.ЗначениеЭлемента) И СтрДлина(Элемент.ЗначениеЭлемента) <= 11 Тогда
				
				Попытка
					ДокументОбъект.Номер = Элемент.ЗначениеЭлемента;
				Исключение
					ДокументОбъект.Номер = "";
				КонецПопытки;
			КонецЕсли;
		
		ИначеЕсли Элемент.ИмяЭлемента = "СтрокаПоТерминалу" Тогда
			
			НомерСтрокиПоТерминалу = НомерСтрокиПоТерминалу + 1;
			СтрокаПоТерминалу = Новый Структура;
			
			Для каждого СтрокаТабличнойЧасти Из Элемент.Строки Цикл
				СтрокаПоТерминалу.Вставить(СтрокаТабличнойЧасти.ИмяЭлемента, СтрокаТабличнойЧасти.ЗначениеЭлемента);
			КонецЦикла;
			
			Если СтрокаПоТерминалу.Свойство("СуммаОперации") И Число(СтрокаПоТерминалу.СуммаОперации) < 0 Тогда
				СтрокаПоТерминалу.Вставить("ТипОперации", "возврат");
			КонецЕсли;
			
			Знч = Неопределено;
			
			Если СтрокаПоТерминалу.Свойство("ТипОперации", Знч) Тогда
				
				Если Не ЗначениеЗаполнено(Знч) Тогда
					
					ОбщегоНазначения.СообщитьПользователю(СтрШаблон(НСтр("ru='В отчете банка по операциям эквайринга (элемент ""Отчет"" №%1, элемент ""СтрокаПоТерминалу"" №%2) не указан тип операции. Элемент ""СтрокаПоТерминалу"" №%2 не загружен.'"), НомерОтчета, НомерСтрокиПоТерминалу));
					Продолжить;
					
				ИначеЕсли ВРег(СокрЛП(Знч)) = ВРег("оплата") Тогда
					СтрТаблЧасть = ДокументОбъект.Покупки.Добавить();
				ИначеЕсли ВРег(СокрЛП(Знч)) = ВРег("возврат") Или ВРег(СокрЛП(Знч)) = ВРег("отмена") Тогда
					СтрТаблЧасть = ДокументОбъект.Возвраты.Добавить();
				Иначе
					Продолжить;
				КонецЕсли;
			Иначе
				
				ОбщегоНазначения.СообщитьПользователю(СтрШаблон(НСтр("ru='В отчете банка по операциям эквайринга (элемент ""Отчет"" №%1, элемент ""СтрокаПоТерминалу"" №%2) не найден элемент ""ТипОперации"". Элемент ""СтрокаПоТерминалу"" №%2 не загружен.'"), НомерОтчета, НомерСтрокиПоТерминалу));
				Продолжить;
			КонецЕсли;
			
			Если СтрокаПоТерминалу.Свойство("НомерТерминала", Знч) Тогда
				
				Если Не ЗначениеЗаполнено(Знч) Тогда
					
					ОбщегоНазначения.СообщитьПользователю(СтрШаблон(НСтр("ru='В отчете банка по операциям эквайринга (элемент ""Отчет"" №%1, элемент ""СтрокаПоТерминалу"" №%2) не указан номер терминала.'"), НомерОтчета, НомерСтрокиПоТерминалу));
					РежимЗаписиДок = РежимЗаписиДокумента.Запись;
				Иначе
					
					Запрос.УстановитьПараметр("Код", СокрЛП(СтрокаПоТерминалу.НомерТерминала));
					
					Выборка = Запрос.Выполнить().Выбрать();
					Если Выборка.Следующий() Тогда
						
						СтрТаблЧасть.ЭквайринговыйТерминал = Выборка.ЭквайринговыйТерминал;
						
						Если Не ЗначениеЗаполнено(ДокументОбъект.ДоговорЭквайринга) Тогда
							
							ДокументОбъект.ДоговорЭквайринга = Выборка.ДоговорЭквайринга;
							ДокументОбъект.Организация       = Выборка.Организация;
							ДокументОбъект.Валюта            = Выборка.Валюта;
							
							Если АтрибутыЭлементаДанныеПоЗапросу.ИНН <> Выборка.ИННОрганизации Тогда
								ОбщегоНазначения.СообщитьПользователю(
									НСтр("ru='В отчете банка по операциям эквайринга идентификационный номер налогоплательщика (ИНН) не соответствует идентификационному номеру налогоплательщика договора подключения к платежной системе в информационной базе.'"));
								РежимЗаписиДок = РежимЗаписиДокумента.Запись;
							КонецЕсли;
								
							Если АтрибутыЭлементаДанныеПоЗапросу.БИК <> Выборка.БИКБанка Тогда
								ОбщегоНазначения.СообщитьПользователю(
									НСтр("ru='В отчете банка по операциям эквайринга банковский идентификационный код (БИК) не соответствует банковскому идентификационному коду договора подключения к платежной системе в информационной базе.'"));
								РежимЗаписиДок = РежимЗаписиДокумента.Запись;
							КонецЕсли;
								
							Если АтрибутыЭлементаДанныеПоЗапросу.РасчетныйСчетОрганизации <> Выборка.НомерСчетаБанка Тогда
								ОбщегоНазначения.СообщитьПользователю(
									НСтр("ru='В отчете банка по операциям эквайринга не указан расчетный счет организации или не соответствует расчетному счету организации договора подключения к платежной системе в информационной базе.'"));
								РежимЗаписиДок = РежимЗаписиДокумента.Запись;
							КонецЕсли;
						КонецЕсли;
					Иначе
						
						ОбщегоНазначения.СообщитьПользователю(
							СтрШаблон(НСтр("ru='В информационной базе не найден эквайринговый терминал с кодом %1.'"), СокрЛП(СтрокаПоТерминалу.НомерТерминала)));
						РежимЗаписиДок = РежимЗаписиДокумента.Запись;
					КонецЕсли;
				КонецЕсли;
			Иначе
				ОбщегоНазначения.СообщитьПользователю(
					СтрШаблон(НСтр("ru='В отчете банка по операциям эквайринга (элемент ""Отчет"" №%1, элемент ""СтрокаПоТерминалу"" №%2) не найден элемент ""НомерТерминала"".'"), НомерОтчета, НомерСтрокиПоТерминалу));
				РежимЗаписиДок = РежимЗаписиДокумента.Запись;
			КонецЕсли;
			
			Если СтрокаПоТерминалу.Свойство("ВремяОперации", Знч) Тогда
				Если Не ЗначениеЗаполнено(Знч) Тогда
					ОбщегоНазначения.СообщитьПользователю(СтрШаблон(НСтр("ru='В отчете банка по операциям эквайринга (элемент ""Отчет"" №%1, элемент ""СтрокаПоТерминалу"" №%2) не указано время операции.'"), НомерОтчета, НомерСтрокиПоТерминалу));
					РежимЗаписиДок = РежимЗаписиДокумента.Запись;
				Иначе
					СтрТаблЧасть.ДатаПлатежа = СтрЗаменить(Лев(СтрокаПоТерминалу.ВремяОперации, 10), "-", "");
				КонецЕсли;
			Иначе
				ОбщегоНазначения.СообщитьПользователю(СтрШаблон(НСтр("ru='В отчете банка по операциям эквайринга (элемент ""Отчет"" №%1, элемент ""СтрокаПоТерминалу"" №%2) не найден элемент ""ВремяОперации"".'"), НомерОтчета, НомерСтрокиПоТерминалу));
				РежимЗаписиДок = РежимЗаписиДокумента.Запись;
			КонецЕсли;
			
			Если СтрокаПоТерминалу.Свойство("СуммаОперации", Знч) Тогда
				Если Не ЗначениеЗаполнено(Знч) Тогда
					ОбщегоНазначения.СообщитьПользователю(СтрШаблон(НСтр("ru='В отчете банка по операциям эквайринга (элемент ""Отчет"" №%1, элемент ""СтрокаПоТерминалу"" №%2) не указана сумма операции.'"), НомерОтчета, НомерСтрокиПоТерминалу));
					РежимЗаписиДок = РежимЗаписиДокумента.Запись;
				Иначе
					Если Число(СтрокаПоТерминалу.СуммаОперации) < 0 Тогда
						СтрТаблЧасть.Сумма = Строка((-1) * Число(СтрокаПоТерминалу.СуммаОперации));
					Иначе
						СтрТаблЧасть.Сумма = СтрокаПоТерминалу.СуммаОперации;
					КонецЕсли;
				КонецЕсли;
			Иначе
				ОбщегоНазначения.СообщитьПользователю(СтрШаблон(НСтр("ru='В отчете банка по операциям эквайринга (элемент ""Отчет"" №%1, элемент ""СтрокаПоТерминалу"" №%2) не найден элемент ""СуммаОперации"".'"), НомерОтчета, НомерСтрокиПоТерминалу));
				РежимЗаписиДок = РежимЗаписиДокумента.Запись;
			КонецЕсли;
			
			СтрокаПоТерминалу.Свойство("НомерКарты", СтрТаблЧасть.НомерПлатежнойКарты);
			СтрокаПоТерминалу.Свойство("КодАвторизации", СтрТаблЧасть.КодАвторизации);
			
			Если СтрокаПоТерминалу.Свойство("Комиссия", Знч) Тогда
				Если ЗначениеЗаполнено(Знч) Тогда
					Если ВРег(СокрЛП(СтрокаПоТерминалу.ТипОперации)) = ВРег("оплата") Тогда
						СуммаКомиссии = СуммаКомиссии + СтрокаПоТерминалу.Комиссия;
					ИначеЕсли ВРег(СокрЛП(СтрокаПоТерминалу.ТипОперации)) = ВРег("возврат")
						Или ВРег(СокрЛП(СтрокаПоТерминалу.ТипОперации)) = ВРег("отмена") Тогда
						СуммаКомиссии = СуммаКомиссии - СтрокаПоТерминалу.Комиссия;
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
			
		ИначеЕсли Элемент.ИмяЭлемента = "КонтрольнаяСуммаПоДате" Тогда
			
			КоличествоЗаписейОплата  = 0;
			КоличествоЗаписейВозврат = 0;
			СуммаИтогоОплата         = 0;
			СуммаИтогоВозврат        = 0;
			
			Для Каждого ЭлементКонтрольнойСуммыПоДате Из Элемент.Строки Цикл
				
				Если ЭлементКонтрольнойСуммыПоДате.ИмяЭлемента = "Дата" Тогда
					Если КонецДня(СтрЗаменить(ЭлементКонтрольнойСуммыПоДате.ЗначениеЭлемента, "-", "")) <> КонецДня(ДокументОбъект.Дата) Тогда
						ОбщегоНазначения.СообщитьПользователю(СтрШаблон(НСтр("ru='В отчете банка по операциям эквайринга (элемент ""Отчет"" №%1) дата в элементе ""КонтрольнаяСуммаПоДате"" не соответствует дате операции.'"), НомерОтчета));
						РежимЗаписиДок = РежимЗаписиДокумента.Запись;
						Прервать;
					КонецЕсли;
				
				ИначеЕсли ЭлементКонтрольнойСуммыПоДате.ИмяЭлемента = "Операция" Тогда
					
					Если ВРег(СокрЛП(ЭлементКонтрольнойСуммыПоДате.Строки[0].ЗначениеЭлемента)) = ВРег("оплата") Тогда
						
						КоличествоЗаписейОплата = КоличествоЗаписейОплата + ЭлементКонтрольнойСуммыПоДате.Строки[1].ЗначениеЭлемента;
						СуммаИтогоОплата        = СуммаИтогоОплата + ЭлементКонтрольнойСуммыПоДате.Строки[2].ЗначениеЭлемента;
						
					ИначеЕсли ВРег(СокрЛП(ЭлементКонтрольнойСуммыПоДате.Строки[0].ЗначениеЭлемента)) = ВРег("возврат")
						Или ВРег(СокрЛП(ЭлементКонтрольнойСуммыПоДате.Строки[0].ЗначениеЭлемента)) = ВРег("отмена") Тогда
						
						КоличествоЗаписейВозврат = КоличествоЗаписейВозврат + ЭлементКонтрольнойСуммыПоДате.Строки[1].ЗначениеЭлемента;
						СуммаИтогоВозврат        = СуммаИтогоВозврат + ЭлементКонтрольнойСуммыПоДате.Строки[2].ЗначениеЭлемента;
					КонецЕсли;
				КонецЕсли;
			КонецЦикла;
			
			Если КоличествоЗаписейОплата <> ДокументОбъект.Покупки.Количество() Тогда
				ОбщегоНазначения.СообщитьПользователю(СтрШаблон(НСтр("ru='В отчете банка по операциям эквайринга (элемент ""Отчет"" №%1) количество записей по оплате в элементе ""КонтрольнаяСуммаПоДате"" не соответствует количеству операций по оплате.'"), НомерОтчета));
				РежимЗаписиДок = РежимЗаписиДокумента.Запись;
			КонецЕсли;
			
			Если СуммаИтогоОплата <> ДокументОбъект.Покупки.Итог("Сумма") Тогда
				ОбщегоНазначения.СообщитьПользователю(СтрШаблон(НСтр("ru='В отчете банка по операциям эквайринга (элемент ""Отчет"" №%1) итоговая сумма по оплате в элементе ""КонтрольнаяСуммаПоДате"" не соответствует итоговой сумме операций по оплате.'"), НомерОтчета));
				РежимЗаписиДок = РежимЗаписиДокумента.Запись;
			КонецЕсли;
			
			Если КоличествоЗаписейВозврат <> ДокументОбъект.Возвраты.Количество() Тогда
				ОбщегоНазначения.СообщитьПользователю(СтрШаблон(НСтр("ru='В отчете банка по операциям эквайринга (элемент ""Отчет"" №%1) количество записей по возврату и по отмене в элементе ""КонтрольнаяСуммаПоДате"" не соответствует количеству операций по возврату.'"), НомерОтчета));
				РежимЗаписиДок = РежимЗаписиДокумента.Запись;
			КонецЕсли;
			
			Если СуммаИтогоВозврат <> ДокументОбъект.Возвраты.Итог("Сумма") Тогда
				ОбщегоНазначения.СообщитьПользователю(СтрШаблон(НСтр("ru='В отчете банка по операциям эквайринга (элемент ""Отчет"" №%1) итоговая сумма по возврату и по отмене в элементе ""КонтрольнаяСуммаПоДате"" не соответствует итоговой сумме операций по возврату.'"), НомерОтчета));
				РежимЗаписиДок = РежимЗаписиДокумента.Запись;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Попытка
		
		Если Не ЗначениеЗаполнено(ДокументОбъект.Дата) Тогда
			
			ОбщегоНазначения.СообщитьПользователю(СтрШаблон(НСтр("ru='При загрузке элемента ""Отчет"" №%1 в документе ""Отчет банка по операциям эквайринга"" не заполнена дата операции по платежной карте. Документ не создан.'"), НомерОтчета));
			Возврат;
			
		ИначеЕсли ДокументОбъект.Покупки.Количество() + ДокументОбъект.Возвраты.Количество() = 0 Тогда
			
			ОбщегоНазначения.СообщитьПользователю(СтрШаблон(НСтр("ru='При загрузке элемента ""Отчет"" №%1 в документе ""Отчет банка по операциям эквайринга"" не заполнены платежи. Документ не создан.'"), НомерОтчета));
			Возврат;
		КонецЕсли;
		
		Если Выборка.ОтражатьКомиссию И СуммаКомиссии <> 0 Тогда
			ДокументОбъект.СуммаКомиссии     = СуммаКомиссии;
			ДокументОбъект.СтатьяРасходов    = Выборка.СтатьяРасходов;
			ДокументОбъект.АналитикаРасходов = Выборка.АналитикаРасходов;
			ДокументОбъект.Подразделение     = Выборка.Подразделение;
		КонецЕсли;
		
		ДокументОбъект.ОтражатьКомиссию = Выборка.ОтражатьКомиссию;
		ДокументОбъект.ДетальнаяСверкаТранзакций = Выборка.ДетальнаяСверкаТранзакций;
		ДокументОбъект.Ответственный = Пользователи.ТекущийПользователь();
		
		Если РежимЗаписиДок = РежимЗаписиДокумента.Проведение И Не ДокументОбъект.ПроверитьЗаполнение() Тогда
			РежимЗаписиДок = РежимЗаписиДокумента.Запись;
		КонецЕсли;
		
		ДокументОбъект.Записать(РежимЗаписиДок);
		
		ОбщегоНазначения.СообщитьПользователю(СтрШаблон(НСтр("ru='%1 документ ""Отчет банка по операциям эквайринга"" №%2 от %3.'"),
			?(РежимЗаписиДок = РежимЗаписиДокумента.Запись, "Записан", "Проведен"),
			ДокументОбъект.Номер,
			ДокументОбъект.Дата));
			
	Исключение
		
		ОбщегоНазначения.СообщитьПользователю(СтрШаблон(
			НСтр("ru='Документ ""Отчет банка по операциям эквайринга"" №%1 от %2 не %3. Произошли ошибки при %4.'"),
			ДокументОбъект.Номер,
			ДокументОбъект.Дата,
			?(РежимЗаписиДок = РежимЗаписиДокумента.Запись, "записан", "проведен"),
			?(РежимЗаписиДок = РежимЗаписиДокумента.Запись, "записи", "проведении")));
	КонецПопытки;
	
КонецПроцедуры

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

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

Функция ОтчетБанкаПоЭквайрингу(ДанныеЗапроса)

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Организации.Ссылка КАК Организация
		|ПОМЕСТИТЬ ОтборПоОрганизации
		|ИЗ
		|	Справочник.Организации КАК Организации
		|ГДЕ
		|	Организации.ИНН = &ИНН
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	БанковскиеСчетаОрганизаций.Ссылка КАК БанковскийСчет
		|ПОМЕСТИТЬ ОтборПоБанковскомуСчету
		|ИЗ
		|	Справочник.БанковскиеСчетаОрганизаций КАК БанковскиеСчетаОрганизаций
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОтборПоОрганизации КАК ОтборПоОрганизации
		|		ПО БанковскиеСчетаОрганизаций.Владелец = ОтборПоОрганизации.Организация
		|			И (БанковскиеСчетаОрганизаций.НомерСчета = &НомерСчета)
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ДоговорыЭквайринга.Ссылка КАК Договор
		|ПОМЕСТИТЬ ОтборПоДоговору
		|ИЗ
		|	Справочник.ДоговорыЭквайринга КАК ДоговорыЭквайринга
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОтборПоОрганизации КАК ОтборПоОрганизации
		|		ПО ДоговорыЭквайринга.Организация = ОтборПоОрганизации.Организация
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОтборПоБанковскомуСчету КАК ОтборПоБанковскомуСчету
		|		ПО ДоговорыЭквайринга.БанковскийСчет = ОтборПоБанковскомуСчету.БанковскийСчет
		|ГДЕ
		|	НЕ ДоговорыЭквайринга.ПометкаУдаления
		|	И &ОтборПоНомеруДоговора
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ОтчетБанкаПоОперациямЭквайринга.Ссылка КАК Документ
		|ИЗ
		|	Документ.ОтчетБанкаПоОперациямЭквайринга КАК ОтчетБанкаПоОперациямЭквайринга
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОтборПоДоговору КАК ОтборПоДоговору
		|		ПО ОтчетБанкаПоОперациямЭквайринга.ДоговорЭквайринга = ОтборПоДоговору.Договор
		|ГДЕ
		|	НЕ ОтчетБанкаПоОперациямЭквайринга.ПометкаУдаления
		|	И ОтчетБанкаПоОперациямЭквайринга.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";
	
	Запрос.УстановитьПараметр("ИНН", ДанныеЗапроса.ИНН);
	Запрос.УстановитьПараметр("НомерСчета", ДанныеЗапроса.РасчетныйСчетОрганизации);
	
	Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ДанныеЗапроса, "НомерДоговора") Тогда
		
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборПоНомеруДоговора", "ДоговорыЭквайринга.Номер = &НомерДоговора");
		Запрос.УстановитьПараметр("НомерДоговора", ДанныеЗапроса.НомерДоговора);
		
	Иначе
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборПоНомеруДоговора", "ИСТИНА");
	КонецЕсли;
	
	Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ДанныеЗапроса, "ДатаПлатежногоПоручения") Тогда
		
		Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(XMLЗначение(Тип("Дата"), ДанныеЗапроса.ДатаПлатежногоПоручения)));
		Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(XMLЗначение(Тип("Дата"), ДанныеЗапроса.ДатаПлатежногоПоручения)));
		
	ИначеЕсли ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ДанныеЗапроса, "НачалоОтчетногоПериода")
		И ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ДанныеЗапроса, "КонецОтчетногоПериода") Тогда
		
		Запрос.УстановитьПараметр("ДатаНачала", XMLЗначение(Тип("Дата"), ДанныеЗапроса.НачалоОтчетногоПериода));
		Запрос.УстановитьПараметр("ДатаОкончания", XMLЗначение(Тип("Дата"), ДанныеЗапроса.КонецОтчетногоПериода));
		
	Иначе
		
		Запрос.УстановитьПараметр("ДатаНачала", Дата('00010101'));
		Запрос.УстановитьПараметр("ДатаОкончания", Дата('00010101'));
		
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Истина);
	Выборка = Запрос.Выполнить().Выбрать();
	УстановитьПривилегированныйРежим(Ложь);
	
	Если Выборка.Количество() > 1 Тогда
		
		СписокПараметров = Новый Массив;
		СписокПараметров.Добавить(НСтр("ru = 'Найдено более одного отчета банка по эквайрингу с параметрами:'"));
		
		Для Каждого ТекущийПараметр Из Запрос.Параметры Цикл
			СписокПараметров.Добавить(СтрШаблон("%1 - %2", ТекущийПараметр.Ключ, ТекущийПараметр.Значение));
		КонецЦикла;
		
		ТекстСообщения = СтрСоединить(СписокПараметров, Символы.ПС);
		ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
		
		Возврат Документы.ОтчетБанкаПоОперациямЭквайринга.СоздатьДокумент();
		
	ИначеЕсли Выборка.Следующий() Тогда
		Возврат Выборка.Документ.ПолучитьОбъект();
	Иначе
		Возврат Документы.ОтчетБанкаПоОперациямЭквайринга.СоздатьДокумент();
	КонецЕсли;

КонецФункции

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

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

#КонецЕсли

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