Обмен с банками / Модуль объекта

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

//++ Локализация

//++ НЕ УТ
Перем КорневойЭлементМанифеста;
Перем ИмяФайлаМанифеста;
Перем КаталогВыгрузкиПодтверждающихДокументов;
Перем ПоддержкаПлатежейВСоответствииС275ФЗ;
//-- НЕ УТ

//-- Локализация

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

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

#Область Выгрузка

// Заполняет табл. часть "Банковские счета" настройками счетов для выгрузки платежей.
//
Процедура ЗаполнитьТаблицуСчетовВыгрузки() Экспорт
	
	ТаблицаСчетов = Обработки.КлиентБанк.ТаблицаСчетов(Неопределено);
	
	//++ Локализация
	ДополнитьТаблицуСчетовПоддержкойПрямогоОбмена(ТаблицаСчетов);
	//-- Локализация
	
	БанковскиеСчета.Загрузить(ТаблицаСчетов);
	
КонецПроцедуры

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

	//++ НЕ УТ
	Если ПоддержкаПлатежейВСоответствииС275ФЗ 
		И ЗначениеЗаполнено(КаталогВыгрузкиПодтверждающихДокументов) Тогда
		ВыгрузитьПодтверждающиеДокументы();
	КонецЕсли;
	//-- НЕ УТ

	//-- Локализация
	
КонецПроцедуры

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

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

	//++ НЕ УТ
	Если ПоддержкаПлатежейВСоответствииС275ФЗ
		И ЗначениеЗаполнено(КаталогВыгрузкиПодтверждающихДокументов) Тогда
		ВыгрузитьПодтверждающиеДокументы(Счет);
	КонецЕсли;
	//-- НЕ УТ

	//-- Локализация
КонецПроцедуры

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

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

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

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

#Область Загрузка

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

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

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

	ПараметрыЗагрузки.Вставить("СоздаватьКонтрагентов", СоздаватьКонтрагентов);
	ПараметрыЗагрузки.Вставить("ПроводитьДокументы",    ПроводитьДокументы);
	ПараметрыЗагрузки.Вставить("Кодировка",             Счет.Кодировка);
	ПараметрыЗагрузки.Вставить("РежимЗаполненияКонтрагентаПоQRПлатежу", РежимЗаполненияКонтрагентаПоQRПлатежу);
	
	Счет.Загружен = Ложь;
	
	ПараметрыОтбора = Новый Структура("БанковскийСчет", Счет.Ссылка);
	ДанныеФайлов = Файлы.НайтиСтроки(ПараметрыОтбора);
	
	Для каждого ТекущаяСтрокаФайла Из ДанныеФайлов Цикл
	
		ПараметрыЗагрузки.Вставить("СтрокиВыписки", ПолучитьИзВременногоХранилища(ТекущаяСтрокаФайла.АдресХранилищаФайла));
		ПараметрыЗагрузки.Вставить("ДокументыКЗагрузке", ДокументыКЗагрузке.ВыгрузитьКолонки());
		ПараметрыЗагрузки.Вставить("ФайлПодтвержденияЗачисления", ТекущаяСтрокаФайла.ФайлПодтвержденияЗачисления);
		
		ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(ИдФормы);
		КлючЗадания = СтрШаблон("%1_%2_%3_%4_%5_%6",
			НСтр("ru='Загрузка выписки банка'"),
			Счет.Ссылка.УникальныйИдентификатор(),
			Пользователи.ТекущийПользователь().УникальныйИдентификатор(),
			Счет.ДатаНачалаЗагрузки,
			Счет.ДатаКонцаЗагрузки,
			Новый УникальныйИдентификатор);
		ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru='Загрузка выписки банка'");
		ПараметрыВыполнения.КлючФоновогоЗадания = КлючЗадания;
		ПараметрыВыполнения.ОжидатьЗавершение = 
			?(ПоследовательнаяЗагрузка, Неопределено, ПараметрыВыполнения.ОжидатьЗавершение);
	
		Результат = ДлительныеОперации.ВыполнитьВФоне(
			"Обработки.КлиентБанк.Загрузить",
			ПараметрыЗагрузки,
			ПараметрыВыполнения);
		
		ТекущаяСтрокаФайла.АдресХранилищаДокументов = Результат.АдресРезультата;
		
		Если Результат.Статус = "Ошибка" Тогда
			Обработки.КлиентБанк.ВывестиОшибкуЗагрузкиФайла(
				Счет.Ссылка, ТекущаяСтрокаФайла.ИмяФайла, Результат.ИнформацияОбОшибке);
		КонецЕсли;
		
		Если Результат.Статус <> "Ошибка" Тогда
			Счет.Загружается = Истина;
		КонецЕсли;
		
		Если Результат.Статус <> "Выполняется" Тогда
			ТекущаяСтрокаФайла.СохранитьФайл = Истина;
		Иначе
			ТекущаяСтрокаФайла.ИдентификаторЗагрузки = Результат.ИдентификаторЗадания;
		КонецЕсли;
		
		Счет.ДанныеЗагрузки = ОбщегоНазначения.ЗначениеВСтрокуXML(Результат);
	
	КонецЦикла;
	
	Отбор = Новый Структура("БанковскийСчет, СохранитьФайл", Счет.Ссылка, Ложь);
	НеЗагруженныеФайлы = Файлы.НайтиСтроки(Отбор);
	
	Если НеЗагруженныеФайлы.Количество() = 0 Тогда
		Счет.Пометка = Ложь;
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

//++ Локализация

//++ НЕ УТ

#Область ВыгрузкаПодтверждающихДокументов

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

// Записывает подтверждающие документы в указанный каталог.
// 
// Параметры:
//  Манифест - см. МанифестПоУмолчанию.
//  Банк - СправочникСсылка.КлассификаторБанков, Строка - Банк, по которому записываются файлы.
//
Процедура ЗаписатьПодтверждающиеДокументы(Манифест, Банк)
	
	КаталогВременныхФайлов = ОбщегоНазначения.СоздатьВременныйКаталог("embdatatmp");
	
	КаталогПеремещенныхФайлов = КаталогВременныхФайлов + "_temp\";
	ПроверитьСоздатьКаталог(КаталогПеремещенныхФайлов);
	
	ПеремещаемыеФайлы = Новый ТаблицаЗначений;
	ПеремещаемыеФайлы.Колонки.Добавить("ИсходноеПолноеИмя");
	ПеремещаемыеФайлы.Колонки.Добавить("ПолноеИмяПослеПеремещения");
	
	Если ТипЗнч(Банк) = Тип("Строка") Тогда
		НаименованиеБанка = Банк;
		КодБанка = "";
	Иначе
		ДанныеБанка = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Банк, "Наименование, Код");
		НаименованиеБанка = СокрЛП(ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ДанныеБанка.Наименование));
		КодБанка = ДанныеБанка.Код;
	КонецЕсли;
	
	МаксРазмерОтдельногоФайла = (1024 * 1024) * Константы.МаксимальныйРазмерФайлаПодтверждающегоДокумента.Получить();
	МаксРазмерАрхива = (1024 * 1024) * Константы.МаксимальныйРазмерФайлаАрхиваПодтверждающихДокументов.Получить();
	
	Если ЗначениеЗаполнено(КаталогВыгрузкиПодтверждающихДокументов) Тогда
		РезультатЗаписиДокументов = Новый Структура("
			|МаксРазмерОтдельногоФайла, 
			|МаксРазмерАрхива, 
			|СуммарныйРазмерВБайтах, 
			|ТребуетсяОптимизацияПоРазмеруАрхива, 
			|ТаблицаРазмеров");
			
		РезультатЗаписиДокументов.Вставить("МаксРазмерОтдельногоФайла", МаксРазмерОтдельногоФайла);
		РезультатЗаписиДокументов.Вставить("МаксРазмерАрхива", МаксРазмерАрхива);
		РезультатЗаписиДокументов.Вставить("СуммарныйРазмерВБайтах", 0);
		РезультатЗаписиДокументов.Вставить("ТребуетсяОптимизацияПоРазмеруАрхива", Ложь);
		РезультатЗаписиДокументов.Вставить("ТаблицаРазмеров", ИнициализацияТаблицыРазмеров());
			
		ЗаписатьФайлыПодтверждающихДокументов(Манифест, КаталогВременныхФайлов, РезультатЗаписиДокументов);
		
		ПорцииЗаписи = ПорцииЗаписи(РезультатЗаписиДокументов, КаталогВременныхФайлов);
		Если РезультатЗаписиДокументов.ТребуетсяОптимизацияПоРазмеруАрхива Тогда
			МанифестыПоПорциям = МанифестыПоПорциям(Манифест, ПорцииЗаписи);
		Иначе
			МанифестыПоПорциям = Новый Массив;
			МанифестыПоПорциям.Добавить(Манифест);
		КонецЕсли;
		
		НомерПорции = 1;
		КоличествоПорций = МанифестыПоПорциям.Количество();
		Для Каждого МанифестПорции Из МанифестыПоПорциям Цикл 
			ЗаписатьМанифестБанка(МанифестПорции, КаталогВременныхФайлов, ПорцииЗаписи);
			
			// Собрать файлы в архив
			СуффиксПорции = ?(КоличествоПорций > 1, " N" + НомерПорции, "");
			ИмяФайла = КодБанка + " " + НаименованиеБанка + СуффиксПорции + ".zip";
			ЗаписьАрхива = Новый ЗаписьZipФайла(КаталогВременныхФайлов + ИмяФайла);
			
			Отбор = Новый Структура("НомерПорции", НомерПорции);
			НайденныеКаталоги = ПорцииЗаписи.Скопировать(Отбор, "Subfolder");
			НайденныеКаталоги.Свернуть("Subfolder");
			
			Для Каждого НайденныйКаталог Из НайденныеКаталоги Цикл
				КаталогПеремещенныхФайловПорции = КаталогПеремещенныхФайлов + НайденныйКаталог["Subfolder"] + "\";
				ИсходныйКаталогФайлов = КаталогВременныхФайлов + НайденныйКаталог["Subfolder"] + "\";
				
				ПроверитьСоздатьКаталог(КаталогПеремещенныхФайловПорции);
				
				ФайлыКаталога = НайтиФайлы(ИсходныйКаталогФайлов, ПолучитьМаскуВсеФайлы());
				
				ОтборПоКаталогу = Новый Структура("НомерПорции, Subfolder", НомерПорции, НайденныйКаталог["Subfolder"]);
				ФайлыКаталогаПорции = ПорцииЗаписи.Скопировать(ОтборПоКаталогу);
				
				Для Каждого ФайлКаталога Из ФайлыКаталога Цикл 
					Если ФайлыКаталогаПорции.Найти(ФайлКаталога.ПолноеИмя, "ПолноеИмяФайла") = Неопределено Тогда
						ПеремещаемыйФайл = ПеремещаемыеФайлы.Добавить();
						ПеремещаемыйФайл.ИсходноеПолноеИмя			= ФайлКаталога.ПолноеИмя;
						ПеремещаемыйФайл.ПолноеИмяПослеПеремещения = КаталогПеремещенныхФайловПорции + ФайлКаталога.Имя;
						
						ПереместитьФайл(ПеремещаемыйФайл.ИсходноеПолноеИмя, ПеремещаемыйФайл.ПолноеИмяПослеПеремещения);
					КонецЕсли;
				КонецЦикла;
			КонецЦикла;
			
			ЗаписьАрхива.Добавить(КаталогВременныхФайлов + "\*.*",
				РежимСохраненияПутейZIP.СохранятьОтносительныеПути,
				РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
			ЗаписьАрхива.Записать();
			
			АдресВременногоХранилища = ПоместитьВоВременноеХранилище(
								Новый ДвоичныеДанные(КаталогВременныхФайлов + ИмяФайла), Новый УникальныйИдентификатор);
			АдресаХранилищФайловПодтверждающихДокументов.Добавить(АдресВременногоХранилища, ИмяФайла);
			
			// Вернем файлы обратно для следующей порции
			Для Каждого ПеремещенныйФайл Из ПеремещаемыеФайлы Цикл 
				ПереместитьФайл(ПеремещенныйФайл.ПолноеИмяПослеПеремещения, ПеремещенныйФайл.ИсходноеПолноеИмя);
			КонецЦикла;
			ПеремещаемыеФайлы.Очистить();
			
			НомерПорции = НомерПорции + 1;
		КонецЦикла;
	КонецЕсли;
	
	УдалитьФайлы(КаталогВременныхФайлов);
	
КонецПроцедуры

Процедура ЗаписатьФайлыПодтверждающихДокументов(Манифест, КаталогВыгрузки, РезультатЗаписиДокументов)
	
	СуммарныйРазмерВБайтах = 0;
	ТаблицаРазмеров = РезультатЗаписиДокументов.ТаблицаРазмеров; // ТаблицаЗначений
	
	РазделительКаталогов = РазделительКаталогов(КаталогВыгрузки);
	
	КаталогиКЗаписи = Новый Структура;
	
	Для Каждого ДокументКВыгрузке Из Манифест[КорневойЭлементМанифеста]["Doc"] Цикл 
		ИмяУзлаИдентификаторовВыгрузки = ИмяПеременнойПоИдентификатору(ДокументКВыгрузке["Subfolder"]);
		Для Каждого ПодтверждающийДокумент Из ДокументКВыгрузке["embDoc"] Цикл
			ИдентификаторыИменаФайлов = Новый Соответствие;
			
			КаталогиКЗаписи.Свойство(ИмяУзлаИдентификаторовВыгрузки, ИдентификаторыИменаФайлов);
			Если ИдентификаторыИменаФайлов = Неопределено Тогда
				ИдентификаторыИменаФайлов = Новый Соответствие;
			КонецЕсли;
			ИдентификаторыИменаФайлов.Вставить(
				ПодтверждающийДокумент["FileName"]["FileName_Attribute"],
				ПодтверждающийДокумент["DocID"]);
			
			КаталогиКЗаписи.Вставить(ИмяУзлаИдентификаторовВыгрузки, ИдентификаторыИменаФайлов);
		КонецЦикла;
	КонецЦикла;
	
	Для Каждого КаталогКЗаписи Из КаталогиКЗаписи Цикл 
		ИмяПодкаталогаЗаписи = ИдентификаторПоИмениПеременной(КаталогКЗаписи.Ключ);
		КаталогЗаписиДокумента = КаталогВыгрузки + РазделительКаталогов + ИмяПодкаталогаЗаписи + "\";
		ПроверитьСоздатьКаталог(КаталогЗаписиДокумента);
		
		Для Каждого ДокументКЗаписи Из КаталогКЗаписи.Значение Цикл 
			ПолноеИмяФайла = КаталогЗаписиДокумента + ДокументКЗаписи.Ключ;
			
			СсылкаНаФайл = Справочники.ДоговорыКонтрагентовПрисоединенныеФайлы.ПолучитьСсылку(
				Новый УникальныйИдентификатор(ДокументКЗаписи.Значение));
			Если Не ОбщегоНазначения.СсылкаСуществует(СсылкаНаФайл) Тогда
				СсылкаНаФайл = Справочники.ДоговорыКредитовИДепозитовПрисоединенныеФайлы.ПолучитьСсылку(
					Новый УникальныйИдентификатор(ДокументКЗаписи.Значение));
			КонецЕсли;
			Если Не ОбщегоНазначения.СсылкаСуществует(СсылкаНаФайл) Тогда
				СсылкаНаФайл = Справочники.ДоговорыМеждуОрганизациямиПрисоединенныеФайлы.ПолучитьСсылку(
					Новый УникальныйИдентификатор(ДокументКЗаписи.Значение));
			КонецЕсли;
			
			Если Не ОбщегоНазначения.СсылкаСуществует(СсылкаНаФайл) Тогда
				Продолжить;
			КонецЕсли;
			
			ДанныеФайла = РаботаСФайлами.ДанныеФайла(СсылкаНаФайл, Новый УникальныйИдентификатор, Истина);
			Файл = ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); // ДвоичныеДанные
			Файл.Записать(ПолноеИмяФайла);
			
			НовыйРазмер = ТаблицаРазмеров.Добавить();
			НовыйРазмер["Subfolder"] = ИмяПодкаталогаЗаписи;
			НовыйРазмер["DocId"] = ДокументКЗаписи.Значение;
			НовыйРазмер["СсылкаНаФайл"] = СсылкаНаФайл;
			НовыйРазмер["ПолноеИмяФайла"] = ПолноеИмяФайла;
			НовыйРазмер["РазмерВБайтах"] = ДанныеФайла.Размер;
			
			СуммарныйРазмерВБайтах = СуммарныйРазмерВБайтах + ДанныеФайла.Размер;
		КонецЦикла;
	КонецЦикла;
	
	РезультатЗаписиДокументов["СуммарныйРазмерВБайтах"] = СуммарныйРазмерВБайтах;
	
КонецПроцедуры

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

Функция МанифестыПоПорциям(Знач Манифест, ПорцииЗаписи)
	
	МанифестыПоПорциям = Новый Массив;
	
	НомераПорций = ПорцииЗаписи.Скопировать(,"НомерПорции");
	НомераПорций.Свернуть("НомерПорции");
	НомераПорцийМассив = НомераПорций.ВыгрузитьКолонку("НомерПорции");
	Для Каждого НомерПорции Из НомераПорцийМассив Цикл 
		МанифестПорции = ОбщегоНазначенияКлиентСервер.СкопироватьСтруктуру(Манифест);
		
		Отбор = Новый Структура("НомерПорции", НомерПорции);
		ПорцияЗаписи = ПорцииЗаписи.Скопировать(Отбор);
		
		ДокументыМанифеста = МанифестПорции[КорневойЭлементМанифеста]["Doc"];
		ДокументыМанифестаКУдалению = Новый Массив;
		Для Каждого ДокументМанифеста Из ДокументыМанифеста Цикл 
			ФайлыДокумента = ДокументМанифеста["embDoc"];
			ФайлыДокументаКУдалению = Новый Массив;
			
			Для Каждого ФайлДокумента Из ФайлыДокумента Цикл 
				Отбор = Новый Структура("Subfolder, DocId", ДокументМанифеста["Subfolder"], ФайлДокумента["DocID"]);
				НайденныеСтроки = ПорцияЗаписи.НайтиСтроки(Отбор);
				Если НайденныеСтроки.Количество() = 0 Тогда
					ФайлыДокументаКУдалению.Добавить(ФайлДокумента);
				КонецЕсли;
			КонецЦикла;
			
			Для Каждого ФайлДокументаКУдалению Из ФайлыДокументаКУдалению Цикл
				ИндексКУдалению = ФайлыДокумента.Найти(ФайлДокументаКУдалению);
				ФайлыДокумента.Удалить(ИндексКУдалению);
			КонецЦикла;
			
			Если ФайлыДокумента.Количество() = 0 Тогда
				ДокументыМанифестаКУдалению.Добавить(ДокументМанифеста);
			КонецЕсли;
		КонецЦикла;
		Для Каждого ДокументМанифестаКУдалению Из ДокументыМанифестаКУдалению Цикл
			ИндексКУдалению = ДокументыМанифеста.Найти(ДокументМанифестаКУдалению);
			ДокументыМанифеста.Удалить(ИндексКУдалению);
		КонецЦикла;
		
		МанифестыПоПорциям.Добавить(МанифестПорции);
	КонецЦикла;
	
	Возврат МанифестыПоПорциям;
	
КонецФункции

Функция ПорцииЗаписи(РезультатЗаписиДокументов, КаталогВременныхФайлов)
	
	ПорцииЗаписи = РезультатЗаписиДокументов.ТаблицаРазмеров.Скопировать(); // ТаблицаЗначений
	ПорцииЗаписи.Сортировать("Subfolder Возр, РазмерВБайтах Убыв");
	ПорцииЗаписи.Колонки.Добавить("НомерПорции");
	
	СуммарныйРазмерВБайтахСжатый = 0;
	НомерПорции = 1;
	
	КаталогПроверкиРазмеров = КаталогВременныхФайлов + "ПроверкаРазмера\";
	ПроверитьСоздатьКаталог(КаталогПроверкиРазмеров);
	ИмяВременногоАрхива = КаталогПроверкиРазмеров + "ПроверочныйФайл.zip";
	
	АрхивЗапись = Новый ЗаписьZipФайла(ИмяВременногоАрхива,,,, УровеньСжатияZIP.Максимальный);
	Для Каждого ПорцияЗаписи Из ПорцииЗаписи Цикл 
		ПорцияЗаписи.НомерПорции = НомерПорции;
		
		Если ПорцииЗаписи.Индекс(ПорцияЗаписи) > 0 Тогда
			АрхивЗапись.Открыть(ИмяВременногоАрхива,,,, УровеньСжатияZIP.Максимальный);
		КонецЕсли;
		АрхивЗапись.Добавить(ПорцияЗаписи.ПолноеИмяФайла);
		АрхивЗапись.Записать();
		
		ПроверочныйФайл = Новый Файл(ИмяВременногоАрхива);
		СуммарныйРазмерВБайтахСжатый = СуммарныйРазмерВБайтахСжатый + ПроверочныйФайл.Размер();
		
		Если СуммарныйРазмерВБайтахСжатый > РезультатЗаписиДокументов.МаксРазмерАрхива Тогда
			ПорцияЗаписи.НомерПорции = ПорцияЗаписи.НомерПорции + 1;
			НомерПорции = НомерПорции + 1;
			СуммарныйРазмерВБайтахСжатый = ПроверочныйФайл.Размер();
			
			РезультатЗаписиДокументов.ТребуетсяОптимизацияПоРазмеруАрхива = Истина;
		КонецЕсли;
	КонецЦикла;
	
	УдалитьФайлы(КаталогПроверкиРазмеров);
	
	Возврат ПорцииЗаписи;
	
КонецФункции

Процедура ЗаписатьЭлементыXML(ЗаписьXML, Элемент, ИмяЭлемента)
	
	Если ТипЗнч(Элемент) = Тип("Структура") Тогда
		ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяЭлемента);
	
		ЗаписатьАтрибутыXML(ЗаписьXML, Элемент);
		
		Для Каждого ЭлементыЭлемента Из Элемент Цикл
			ЗаписатьЭлементыXML(ЗаписьXML, ЭлементыЭлемента.Значение, ЭлементыЭлемента.Ключ);
		КонецЦикла;
	
		ЗаписьXML.ЗаписатьКонецЭлемента();
	ИначеЕсли ТипЗнч(Элемент) = Тип("Массив") Тогда
		Для Каждого ЭлементыЭлемента Из Элемент Цикл 
			ЗаписатьЭлементыXML(ЗаписьXML, ЭлементыЭлемента, ИмяЭлемента);
		КонецЦикла;
	ИначеЕсли СтрНайти(ИмяЭлемента, "_Attribute") = 0 Тогда // Кроме атрибутов
		ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяЭлемента);
		ЗаписьXML.ЗаписатьТекст(XMLСтрока(Элемент));
		ЗаписьXML.ЗаписатьКонецЭлемента();
	КонецЕсли;
	
КонецПроцедуры

Процедура ЗаписатьАтрибутыXML(ЗаписьXML, Элемент)
	
	Для Каждого ЭлементыЭлемента Из Элемент Цикл 
		Если СтрНайти(ЭлементыЭлемента.Ключ, "_Attribute") > 0 Тогда
			ЗаписьXML.ЗаписатьАтрибут(
				СтрЗаменить(ЭлементыЭлемента.Ключ, "_Attribute", ""),
				XMLСтрока(ЭлементыЭлемента.Значение));
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

Процедура ДобавитьИнформациюОПлатеже(МанифестБанка, ДокументыКВыгрузкеПоБанку)
	
	Для Каждого Документ Из ДокументыКВыгрузкеПоБанку Цикл
		
		ДокументСсылка = Документ["Ссылка"];
		
		Если Не ТипЗнч(ДокументСсылка) = Тип("ДокументСсылка.СписаниеБезналичныхДенежныхСредств") Тогда
			Продолжить;
		КонецЕсли;
		
		РеквизитыПлатежа = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДокументСсылка, 
			"БанковскийСчет.ГосударственныйКонтракт.НомерГОЗ, 
			|ОплатаПоЗаявкам,
			|Номер,
			|Дата,
			|СуммаДокумента");
		
		Если Не РеквизитыПлатежа.ОплатаПоЗаявкам Тогда
			Продолжить;
		КонецЕсли;
		
		МанифестДокумента = МанифестДокументаПоУмолчанию();
		НомерБезЛидирующихНулей = ПрефиксацияОбъектовКлиентСервер.УдалитьЛидирующиеНулиИзНомераОбъекта(РеквизитыПлатежа.Номер);
		МанифестДокумента.Вставить("No", ?(ЗначениеЗаполнено(НомерБезЛидирующихНулей), НомерБезЛидирующихНулей, "0"));
		МанифестДокумента.Вставить("Date", XMLДата(РеквизитыПлатежа.Дата));
		МанифестДокумента.Вставить("Summ", РеквизитыПлатежа.СуммаДокумента);
		МанифестДокумента.Вставить("Subfolder", НомерБезЛидирующихНулей);
		
		// Заполнение свойств IdPayment, PaymentType
		ЗаполнитьЗначенияСвойств(МанифестДокумента, 
			ИдентификаторИПредставлениеТипаПлатежа(ДокументСсылка));
		
		МанифестДокумента.Вставить("IGK", СокрЛП(РеквизитыПлатежа.БанковскийСчетГосударственныйКонтрактНомерГОЗ));
		ДокументыКорневогоЭлементаМанифеста = МанифестБанка[КорневойЭлементМанифеста]["Doc"]; // Массив
		ДокументыКорневогоЭлементаМанифеста.Добавить(МанифестДокумента);
		ДобавитьИнформациюОПодтверждающихДокументах(МанифестДокумента, ДокументСсылка);
	КонецЦикла;
	
КонецПроцедуры

Процедура ДобавитьИнформациюОПодтверждающихДокументах(МанифестДокумента, ДокументСсылка)
	
	Запрос = Новый Запрос;
	Запрос.Текст = "
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ПодтверждающиеДокументы.Номер         КАК Номер,
	|	ПодтверждающиеДокументы.Дата          КАК Дата,
	|	ПодтверждающиеДокументы.ВидДокумента  КАК ВидДокумента,
	|	ПодтверждающиеДокументы.Файл          КАК Файл
	|ИЗ
	|	Документ.СписаниеБезналичныхДенежныхСредств.РасшифровкаПлатежа КАК РасшифровкаПлатежа
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		Документ.ЗаявкаНаРасходованиеДенежныхСредств.ПодтверждающиеДокументы КАК ПодтверждающиеДокументы
	|	ПО
	|		ПодтверждающиеДокументы.Ссылка = РасшифровкаПлатежа.ЗаявкаНаРасходованиеДенежныхСредств
	|ГДЕ
	|	РасшифровкаПлатежа.Ссылка = &ДокументСсылка
	|	И НЕ ПодтверждающиеДокументы.Файл ЕСТЬ NULL
	|";
	
	Запрос.УстановитьПараметр("ДокументСсылка", ДокументСсылка);
	
	ПодтверждающиеДокументы = Запрос.Выполнить().Выгрузить();
	
	// Обеспечим запись файлов с одинаковыми именами
	ИспользуемыеИменаФайлов = Новый Соответствие;
	Для Каждого СтрокаПодтверждающихДокументов Из ПодтверждающиеДокументы Цикл 
		МанифестПодтверждающегоДокумента = МанифестПодтверждающегоДокументаПоУмолчанию();
		МанифестПодтверждающегоДокумента.Вставить("DocId",
			Строка(СтрокаПодтверждающихДокументов.Файл.УникальныйИдентификатор()));
		МанифестПодтверждающегоДокумента.Вставить("No",
			?(ЗначениеЗаполнено(СтрокаПодтверждающихДокументов.Номер), СтрокаПодтверждающихДокументов.Номер, "0"));
		МанифестПодтверждающегоДокумента.Вставить("Date", XMLДата(СтрокаПодтверждающихДокументов.Дата));
		
		// Заполнение свойств IdDoc, DocName
		ЗаполнитьЗначенияСвойств(МанифестПодтверждающегоДокумента, 
			ИдентификаторИПредставлениеВидаДокумента(СтрокаПодтверждающихДокументов.ВидДокумента));
		МанифестПодтверждающегоДокумента.Вставить("FileName",
			СвойстваФайла(СтрокаПодтверждающихДокументов.Файл, ИспользуемыеИменаФайлов));
		МанифестДокументаДок = МанифестДокумента["embDoc"]; // Массив
		МанифестДокументаДок.Добавить(МанифестПодтверждающегоДокумента);
	КонецЦикла;
	
КонецПроцедуры

Функция ИдентификаторИПредставлениеВидаДокумента(ВидДокумента)
	
	ИдентификаторИПредставлениеВидаДокумента = Новый Структура("IdDoc, DocName");
	
	Если ЗначениеЗаполнено(ВидДокумента) Тогда
		ИдентификаторИПредставлениеВидаДокумента.Вставить("IdDoc", СокрЛП(ВидДокумента.Код));
		ИдентификаторИПредставлениеВидаДокумента.Вставить("DocName", ВидДокумента.Наименование);
	КонецЕсли;
	
	Возврат ИдентификаторИПредставлениеВидаДокумента;
	
КонецФункции

Функция ИдентификаторИПредставлениеТипаПлатежа(Документ)
	
	ИдентификаторИПредставлениеТипаПлатежа = Новый Структура("IdPayment, PaymentType");
	
	ЗаявкаНаРасходованиеДенежныхСредств = Документ.ЗаявкаНаРасходованиеДенежныхСредств;
	Если ЗначениеЗаполнено(ЗаявкаНаРасходованиеДенежныхСредств) Тогда
		ИдентификаторИПредставлениеТипаПлатежа.Вставить("IdPayment",
			СокрЛП(ЗаявкаНаРасходованиеДенежныхСредств.ТипПлатежаФЗ275.Код));
		ИдентификаторИПредставлениеТипаПлатежа.Вставить("PaymentType",
			ЗаявкаНаРасходованиеДенежныхСредств.ТипПлатежаФЗ275.Наименование);
	КонецЕсли;
	
	Возврат ИдентификаторИПредставлениеТипаПлатежа;
	
КонецФункции

Функция ДокументыКВыгрузкеПоБанку(СоответствиеБанковИСчетов, Банк)
	
	ДокументыКВыгрузкеПоБанку = Новый Массив;
	
	СчетаБанка = СоответствиеБанковИСчетов[Банк];
	
	Для Каждого СчетБанка Из СчетаБанка Цикл
		ДокументыКВыгрузкеПоСчету = ДокументыКВыгрузкеПоСчету(СчетБанка);
		Для Каждого ДокументКВыгрузкеПоСчету Из ДокументыКВыгрузкеПоСчету Цикл 
			ДокументыКВыгрузкеПоБанку.Добавить(ДокументКВыгрузкеПоСчету);
		КонецЦикла;
	КонецЦикла;
	
	Возврат ДокументыКВыгрузкеПоБанку;
	
КонецФункции

Функция МанифестПоУмолчанию()
	
	СвойстваКорневогоЭлемента = Новый Структура("DateTimeFile_Attribute, Author_Attribute, Doc"); 
	
	СвойстваКорневогоЭлемента.Вставить("DateTimeFile_Attribute", XMLСтрока(ТекущаяДатаСеанса())); // Пустая дата
	СвойстваКорневогоЭлемента.Вставить("Author_Attribute",
		Метаданные.Синоним + ", " + НСтр("ru= 'версия'") + " " + Метаданные.Версия);
	СвойстваКорневогоЭлемента.Вставить("Doc", Новый Массив);
	
	Манифест = Новый Структура(КорневойЭлементМанифеста, СвойстваКорневогоЭлемента);
	
	Возврат Манифест;
	
КонецФункции

Функция МанифестДокументаПоУмолчанию()
	
	Манифест = Новый Структура("No, Date, Summ, Subfolder, IdPayment, PaymentType, IGK, embDoc");
	
	Манифест.Вставить("No", 1);
	Манифест.Вставить("Date", XMLДата(Дата(1,1,1)));
	Манифест.Вставить("embDoc", Новый Массив);
	
	Возврат Манифест;
	
КонецФункции

Функция МанифестПодтверждающегоДокументаПоУмолчанию()
	
	Манифест = Новый Структура("DocId, No, Date, IdDoc, DocName, FileName");
	Манифест.Вставить("FileName", Новый Структура);
	
	Возврат Манифест;
	
КонецФункции

Функция МанифестФайлаПоУмолчанию()
	
	Манифест = Новый Структура("FileName_Attribute, TypeFile_Attribute, SizeFile_Attribute");
	
	Возврат Манифест;
	
КонецФункции

Процедура ПроверитьСоздатьКаталог(Путь)
	
	Каталог = Новый Файл(Путь);
	Если Не Каталог.Существует() Тогда
		СоздатьКаталог(Путь);
	КонецЕсли;
	
КонецПроцедуры

Функция РазделительКаталогов(Каталог)
	
	Возврат ?(СтрЗаканчиваетсяНа(Каталог, "\"), "", "\");
	
КонецФункции

Функция СвойстваФайла(Файл, ИспользуемыеИменаФайлов)
	
	СвойстваФайла = МанифестФайлаПоУмолчанию();
	
	ИмяФайла = СокрЛП(Файл.Наименование) + "." + Файл.Расширение;
	КоличествоПовторенийИмени = ИспользуемыеИменаФайлов[ИмяФайла];
	
	Если КоличествоПовторенийИмени <> Неопределено Тогда
		КоличествоПовторенийИмени = КоличествоПовторенийИмени + 1;
		ИспользуемыеИменаФайлов.Вставить(ИмяФайла, КоличествоПовторенийИмени);
		
		ИмяФайла = СокрЛП(Файл.Наименование) + " (" + КоличествоПовторенийИмени + ")" + "." + Файл.Расширение;
	Иначе
		ИспользуемыеИменаФайлов.Вставить(ИмяФайла, 1);
	КонецЕсли;
	
	СвойстваФайла.Вставить("FileName_Attribute", ИмяФайла);
	СвойстваФайла.Вставить("TypeFile_Attribute", Файл.Расширение);
	СвойстваФайла.Вставить("SizeFile_Attribute", Файл.Размер);
	
	Возврат СвойстваФайла;
	
КонецФункции

Функция XMLДата(Дата)
	
	Возврат Строка(Формат(Год(Дата),"ЧЦ=4; ЧВН=; ЧГ=0")) + "-"
		+ Строка(Формат(Месяц(Дата), "ЧЦ=2; ЧВН=")) + "-"
		+ Строка(Формат(День(Дата), "ЧЦ=2; ЧВН="));
	
КонецФункции

Функция ИнициализацияТаблицыРазмеров()
	
	ТаблицаРазмеров = Новый ТаблицаЗначений;
	ТаблицаРазмеров.Колонки.Добавить("Subfolder");
	ТаблицаРазмеров.Колонки.Добавить("DocId");
	ТаблицаРазмеров.Колонки.Добавить("СсылкаНаФайл");
	ТаблицаРазмеров.Колонки.Добавить("ПолноеИмяФайла");
	ТаблицаРазмеров.Колонки.Добавить("РазмерВБайтах");
	
	Возврат ТаблицаРазмеров;
	
КонецФункции

Функция ИмяПеременнойПоИдентификатору(Идентификатор)
	
	ИмяПеременнойПоИдентификатору = Строка(Идентификатор);
	ИмяПеременнойПоИдентификатору = "_" + СтрЗаменить(ИмяПеременнойПоИдентификатору, "-", "_");
	
	Возврат ИмяПеременнойПоИдентификатору;
	
КонецФункции

Функция ИдентификаторПоИмениПеременной(ИмяПеременной)
	
	ИдентификаторПоИмениПеременной = Прав(ИмяПеременной, СтрДлина(ИмяПеременной)-1);
	ИдентификаторПоИмениПеременной = СтрЗаменить(ИдентификаторПоИмениПеременной, "_", "-");
	
	Возврат ИдентификаторПоИмениПеременной;
	
КонецФункции

#КонецОбласти
//-- НЕ УТ

//-- Локализация

#Область ВыгрузкаПорциямиПоПравиламОбъединения

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

Процедура ИзменитьРеквизитыСчетовПотока(Счета, ИзменяемыеПараметры)
	
	Для Каждого Счет Из Счета Цикл
		ЗаполнитьЗначенияСвойств(Счет, ИзменяемыеПараметры);
	КонецЦикла;
	
КонецПроцедуры

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

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

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

Процедура ПроверитьДокументыКВыгрузке()
	
	// Основные реквизиты
	Проверки = Новый Соответствие;
	Проверки.Вставить("Номер",   НСтр("ru='Номер документа'"));
	Проверки.Вставить("Дата",    НСтр("ru='Дата документа'"));
	Проверки.Вставить("Сумма",   НСтр("ru='Сумма документа'"));
	
	// Реквизиты организации
	ПроверкиОрганизацииПР = Новый Соответствие;
	ПроверкиОрганизацииПР.Вставить("ОрганизацияРасчСчет",          НСтр("ru='Банковский счет организации'"));
	ПроверкиОрганизацииПР.Вставить("ОрганизацияНаим",              НСтр("ru='Наименование организации'"));
	ПроверкиОрганизацииПР.Вставить("ОрганизацияИНН",               НСтр("ru='ИНН организации'"));
	
	// Реквизиты организации непрямые расчеты
	ПроверкиОрганизацииНПР = Новый Соответствие;
	ПроверкиОрганизацииНПР.Вставить("ОрганизацияРасчСчет",         НСтр("ru='Банковский счет организации'"));
	ПроверкиОрганизацииНПР.Вставить("ОрганизацияБанкДляРасчетов",  НСтр("ru='Банк для расчетов организации'"));
	ПроверкиОрганизацииНПР.Вставить("ОрганизацияГородБанка",       НСтр("ru='Город банка организации'"));
	ПроверкиОрганизацииНПР.Вставить("ОрганизацияБИКРЦБанка",       НСтр("ru='БИК РЦ банка организации'"));
	
	// Реквизиты контрагента
	ПроверкиКонтрагентаПР = Новый Соответствие;
	ПроверкиКонтрагентаПР.Вставить("КонтрагентРасчСчет",           НСтр("ru='Банковский счет контрагента'"));
	ПроверкиКонтрагентаПР.Вставить("КонтрагентНаим",               НСтр("ru='Контрагент'"));
	ПроверкиКонтрагентаПР.Вставить("КонтрагентИНН",                НСтр("ru='ИНН контрагента'"));
	
	// Реквизиты контрагента непрямые расчеты
	ПроверкиКонтрагентаНПР = Новый Соответствие;
	ПроверкиКонтрагентаНПР.Вставить("КонтрагентРасчСчет",          НСтр("ru='Банковский счет контрагента'"));
	ПроверкиКонтрагентаНПР.Вставить("КонтрагентБанкДляРасчетов",   НСтр("ru='Банк для расчетов контрагента'"));
	ПроверкиКонтрагентаНПР.Вставить("КонтрагентГородБанка",        НСтр("ru='Город банка контрагента'"));
	ПроверкиКонтрагентаНПР.Вставить("КонтрагентБИКРЦБанка",        НСтр("ru='БИК РЦ банка контрагента'"));
	
	ПроверкаISO = Новый Соответствие;
	ПроверкаISO.Вставить("ОрганизацияСВИФТБанка", НСтр("ru = 'Идентификатор банка организации'"));
	ПроверкаISO.Вставить("ОрганизацияБИКБанка", НСтр("ru = 'Идентификатор банка организации'"));
	ПроверкаISO.Вставить("КонтрагентСВИФТБанка", НСтр("ru = 'Идентификатор банка получателя'"));
	ПроверкаISO.Вставить("КонтрагентБИКБанка", НСтр("ru = 'Идентификатор банка получателя'"));
	
	Для каждого ДокументКВыгрузке Из ДокументыКВыгрузке Цикл
		
		СтрокаОшибки = "";
		
		Счет = БанковскиеСчета.Найти(ДокументКВыгрузке.БанковскийСчет, "Ссылка");
		
		Если Счет.ФорматОбмена = ПредопределенноеЗначение("Перечисление.ФорматОбменаСБанком.ClientBankExchange1c") Тогда
			
			Для каждого Проверка Из Проверки Цикл
				Если Не ЗначениеЗаполнено(ДокументКВыгрузке[Проверка.Ключ]) Тогда
					СтрокаОшибки = СтрокаОшибки + " " + Проверка.Значение + ",";
				КонецЕсли;
			КонецЦикла;
			
			Если Не ЗначениеЗаполнено(ДокументКВыгрузке.ОрганизацияБанкДляРасчетов) Тогда
				ПроверкаСчетаОрганизации = ПроверкиОрганизацииПР;
			Иначе
				ПроверкаСчетаОрганизации = ПроверкиОрганизацииНПР;
			КонецЕсли;
			Для каждого Проверка Из ПроверкаСчетаОрганизации Цикл
				Если Не ЗначениеЗаполнено(ДокументКВыгрузке[Проверка.Ключ]) Тогда
					СтрокаОшибки = СтрокаОшибки + " " + Проверка.Значение + ",";
				КонецЕсли;
			КонецЦикла;
			
			Если Не ЗначениеЗаполнено(ДокументКВыгрузке.КонтрагентБанкДляРасчетов) Тогда
				ПроверкаСчетаКонтрагента = ПроверкиКонтрагентаПР;
			Иначе
				ПроверкаСчетаКонтрагента = ПроверкиКонтрагентаНПР;
			КонецЕсли;
			Для каждого Проверка Из ПроверкаСчетаКонтрагента Цикл
				Если ДокументКВыгрузке.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицоНеРезидент
					И Проверка.Ключ = "КонтрагентИНН" Тогда
					Продолжить;
				КонецЕсли;
					
				Если Не ЗначениеЗаполнено(ДокументКВыгрузке[Проверка.Ключ]) Тогда
					СтрокаОшибки = СтрокаОшибки + " " + Проверка.Значение + ",";
				КонецЕсли;
			КонецЦикла;
			
		ИначеЕсли Счет.ФорматОбмена = ПредопределенноеЗначение("Перечисление.ФорматОбменаСБанком.ISO20022") Тогда
			
			Если Не ЗначениеЗаполнено(ДокументКВыгрузке.ОрганизацияСВИФТБанка)
				И Не ЗначениеЗаполнено(ДокументКВыгрузке.ОрганизацияБИКБанка) Тогда
				
				Текст = НСтр("ru='Идентификатор банка организации (БИК / SWIFT)'");
				СтрокаОшибки = СтрокаОшибки + " " + Текст + ",";
				
			КонецЕсли;
					
			Если Не ЗначениеЗаполнено(ДокументКВыгрузке.КонтрагентСВИФТБанка)
				И Не ЗначениеЗаполнено(ДокументКВыгрузке.КонтрагентБИКБанка) Тогда
				
				Текст = НСтр("ru='Идентификатор банка получателя (БИК / SWIFT)'");
				СтрокаОшибки = СтрокаОшибки + " " + Текст + ",";
				
			КонецЕсли;
			
		КонецЕсли;
		
		Если ЗначениеЗаполнено(СтрокаОшибки) Тогда
			СтрокаОшибки = Лев(СтрокаОшибки, СтрДлина(СтрокаОшибки) - 1);
			ДокументКВыгрузке.ЕстьОшибка = Истина;
			ДокументКВыгрузке.Выгружать = Ложь;
			ДокументКВыгрузке.ОписаниеОшибок = НСтр("ru='Не заполнены реквизиты платежа:'") + СтрокаОшибки;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

Функция ДокументыКВыгрузкеПоСчетам(Счета)
	
	ДокументыКВыгрузкеПоСчетам = Новый Массив;
	
	Для Каждого Счет Из Счета Цикл 
		Отбор = Новый Структура;
		Отбор.Вставить("Выгружать", Истина);
		Отбор.Вставить("БанковскийСчет", Счет["Ссылка"]);
		
		НайденныеДокументы = ДокументыКВыгрузке.НайтиСтроки(Отбор);
		
		Для Каждого НайденныйДокумент Из НайденныеДокументы Цикл 
			ДокументыКВыгрузкеПоСчетам.Добавить(НайденныйДокумент);
		КонецЦикла;
	КонецЦикла;
	
	Возврат ДокументыКВыгрузкеПоСчетам;
	
КонецФункции

Функция ДокументыКВыгрузкеПоСчету(Счет)
	
	Отбор = Новый Структура;
	Отбор.Вставить("Выгружать", Истина);
	Отбор.Вставить("БанковскийСчет", Счет["Ссылка"]);
	
	Возврат ДокументыКВыгрузке.НайтиСтроки(Отбор);
	
КонецФункции

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

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

			Строка.Параметры.Контрагент =
				?(ПустаяСтрока(СтрокаИсточника.Получатель1), СтрокаИсточника.Получатель, СтрокаИсточника.Получатель1);
			Строка.Параметры.Счет = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1 (%2)'"),
				СтрокаИсточника.ПолучательСчет,
				Валюта);
				
			Строка.Параметры.СуммаСписание    = СтрокаИсточника.СуммаСписано;
			Строка.Параметры.СуммаПоступление = "";
			Строка.Параметры.Дата             =
				?(ПустаяСтрока(СтрокаИсточника.Дата), Формат(СтрокаИсточника.ДатаДок, "ДЛФ=Д"), СтрокаИсточника.Дата);
			ИтогоСуммаР                       = ИтогоСуммаР + СтрокаИсточника.СуммаСписано;

		Иначе
			Продолжить;
		КонецЕсли;
		
		Если Загружен Тогда
			Док = СтрокаИсточника.Документ;
			Если ЗначениеЗаполнено(Док) Тогда
				Строка.Параметры.Документ     = Док;
				ОбластьСтрока = Строка.Области["Строка"]; // ОбластьЯчеекТабличногоДокумента 
				ОбластьСтрока.ЦветТекста = ЦветаСтиля.ЦветТекстаФормы;
			Иначе
				Строка.Параметры.Документ     = НСтр("ru='НЕ ЗАГРУЖЕН'");
				Если ЗначениеЗаполнено(СтрокаИсточника.ОшибкиЗагрузки) Тогда
					Строка.Параметры.Документ = Строка.Параметры.Документ + ": " + СтрокаИсточника.ОшибкиЗагрузки;
				КонецЕсли;
				ОбластьСтрока = Строка.Области["Строка"]; // ОбластьЯчеекТабличногоДокумента
				ОбластьСтрока.ЦветТекста = ЦветаСтиля.ЦветОтрицательногоЧисла;
			КонецЕсли;
		КонецЕсли;
		
		Строка.Параметры.Номер             = СтрокаИсточника.Номер;
		Строка.Параметры.НазначениеПлатежа = СтрокаИсточника.НазначениеПлатежа;
		
		Инд = Инд + 1;
		Строка.Параметры["Индекс"] = Инд;
		
		ПолеОтчета.Вывести(Строка);
		
	КонецЦикла;
	
	Подвал.Параметры.ИтогоСуммаП = ИтогоСуммаП;
	Подвал.Параметры.ИтогоСуммаР = ИтогоСуммаР;
	
	ПолеОтчета.Вывести(Подвал);
	ПолеОтчета.ОтображатьГруппировки = Ложь;
	ПолеОтчета.ОтображатьЗаголовки   = Ложь;
	ПолеОтчета.ОтображатьСетку       = Ложь;
	ПолеОтчета.ТолькоПросмотр        = Истина;
	
КонецПроцедуры

Процедура ЗаполнитьИнформациюОПолучателяхПлательщиках(ТаблицаПлатежей)

	МассивДокументов = ТаблицаПлатежей.ВыгрузитьКолонку("Ссылка");
	ДанныеКонтрагентов = ДенежныеСредстваСервер.СведенияОПолучателеПлательщикеПоДокументам(МассивДокументов);
	
	Для Каждого СтрокаТаблицы Из ТаблицаПлатежей Цикл
		
		Если ТипЗнч(СтрокаТаблицы.БанковскийСчетКонтрагента) = Тип("СправочникСсылка.БанковскиеСчетаОрганизаций") Тогда
			
			Если СтрокаТаблицы.Операция = Перечисления.ХозяйственныеОперации.КонвертацияВалюты Тогда
				Обработки.КлиентБанк.ЗаполнитьЗначениеРеквизитаПоДокументу(
					ДанныеКонтрагентов,
					СтрокаТаблицы.КонтрагентНаим,
					СтрокаТаблицы.Ссылка,
					4);
			Иначе
				Обработки.КлиентБанк.ЗаполнитьЗначениеРеквизитаПоДокументу(
					ДанныеКонтрагентов,
					СтрокаТаблицы.КонтрагентНаим,
					СтрокаТаблицы.Ссылка,
					2);
			КонецЕсли;
			
		Иначе
			Обработки.КлиентБанк.ЗаполнитьЗначениеРеквизитаПоДокументу(
				ДанныеКонтрагентов,
				СтрокаТаблицы.КонтрагентНаим,
				СтрокаТаблицы.Ссылка,
				0);
		КонецЕсли;
		
		Если СтрокаТаблицы.Операция = Перечисления.ХозяйственныеОперации.КонвертацияВалюты Тогда
			
			Обработки.КлиентБанк.ЗаполнитьЗначениеРеквизитаПоДокументу(
				ДанныеКонтрагентов,
				СтрокаТаблицы.КонтрагентНаименованиеМеждународное,
				СтрокаТаблицы.Ссылка,
				6);
			Обработки.КлиентБанк.ЗаполнитьЗначениеРеквизитаПоДокументу(
				ДанныеКонтрагентов,
				СтрокаТаблицы.КПППолучателя,
				СтрокаТаблицы.Ссылка,
				7);
			
		Иначе
			
			Обработки.КлиентБанк.ЗаполнитьЗначениеРеквизитаПоДокументу(
				ДанныеКонтрагентов,
				СтрокаТаблицы.КонтрагентНаименованиеМеждународное,
				СтрокаТаблицы.Ссылка,
				3);
				
			Обработки.КлиентБанк.ЗаполнитьЗначениеРеквизитаПоДокументу(
				ДанныеКонтрагентов,
				СтрокаТаблицы.КПППолучателя,
				СтрокаТаблицы.Ссылка,
				1);
			
		КонецЕсли;
		
		Обработки.КлиентБанк.ЗаполнитьЗначениеРеквизитаПоДокументу(
			ДанныеКонтрагентов,
			СтрокаТаблицы.ОрганизацияНаим,
			СтрокаТаблицы.Ссылка,
			4);
		Обработки.КлиентБанк.ЗаполнитьЗначениеРеквизитаПоДокументу(
			ДанныеКонтрагентов,
			СтрокаТаблицы.ОрганизацияНаименованиеМеждународное,
			СтрокаТаблицы.Ссылка,
			6);
		Обработки.КлиентБанк.ЗаполнитьЗначениеРеквизитаПоДокументу(
			ДанныеКонтрагентов,
			СтрокаТаблицы.КПППлательщика,
			СтрокаТаблицы.Ссылка,
			7);
		
	КонецЦикла;

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

//++ Локализация

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

//-- Локализация

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

#КонецЕсли

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