Обмен с банками / Выгрузка в банк / Модуль формы

файл

#Область ОписаниеПеременных

&НаКлиенте
Перем СуммыПлатежейКВыгрузке;

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

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

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


	//-- Локализация
	
	СобытияФорм.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
	
КонецПроцедуры

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
	
	Объект.ТолькоНевыгруженные = (ТолькоНевыгруженные = 1);
	
	Если Период = НСтр("ru='Все время'") Тогда
		Объект.ДатаНачалаВыгрузки  = '00010101';
		Объект.ДатаКонцаВыгрузки   = '00010101';
	ИначеЕсли Период = "ЗаДату" Тогда
		Объект.ДатаНачалаВыгрузки  = НачалоДня(ДатаОтбор);
		Объект.ДатаКонцаВыгрузки   = КонецДня(ДатаОтбор);
	ИначеЕсли ТипЗнч(Период) = Тип("Дата") Тогда
		Объект.ДатаНачалаВыгрузки  = Период;
		Объект.ДатаКонцаВыгрузки   = КонецДня(Период);
	ИначеЕсли Период = НСтр("ru='Сегодня'") Тогда
		Объект.ДатаНачалаВыгрузки  = ТекущаяДатаСеанса();
		Объект.ДатаКонцаВыгрузки   = КонецДня(ТекущаяДатаСеанса());
	ИначеЕсли Период = НСтр("ru='Три дня'") Тогда
		Объект.ДатаНачалаВыгрузки  = ТекущаяДатаСеанса() - 3 * 24 * 3600;
		Объект.ДатаКонцаВыгрузки   = КонецДня(ТекущаяДатаСеанса());
	ИначеЕсли Период = НСтр("ru='Неделю'") Тогда
		Объект.ДатаНачалаВыгрузки  = ТекущаяДатаСеанса() - 7 * 24 * 3600;
		Объект.ДатаКонцаВыгрузки   = КонецДня(ТекущаяДатаСеанса());
	КонецЕсли;
	
	ОбновитьСписокПлатежей();
	
КонецПроцедуры

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

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

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

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

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

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

&НаКлиенте
Процедура ВопросОЗакрытии(Ответ, ДополнительныеПараметры) Экспорт
	
	Если Ответ <> Неопределено Тогда
		Если Ответ = 1 Тогда
			УдалитьИЗакрыть(Неопределено);
		ИначеЕсли Ответ = 2 Тогда
			ЗакрытьБезВопроса = Истина;
			Закрыть();
		КонецЕсли;
	Иначе
		ЗакрытьБезВопроса = Истина;
		Закрыть();
	КонецЕсли;
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура КаталогВыгрузкиПодтверждающихДокументовНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

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


	//-- Локализация
	Возврат;

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

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


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

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

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

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

&НаКлиенте
Процедура БанковскиеСчетаПометкаПриИзменении(Элемент)
	
	ПодключитьОбработчикОжидания("ОбработатьПометкуСчета", 0.1, Истина);
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура БанковскиеСчетаНастройкаОбменаПриИзменении(Элемент)
	
	ТекущиеДанные = Элементы.БанковскиеСчета.ТекущиеДанные;
	ТекущиеДанные.ПравилоФайловогоОбменаСБанками = ТекущиеДанные.НастройкаОбмена;
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ПериодПриИзменении(Элемент)
	
	ЛокальнаяТекущаяДата = ЛокальнаяТекущаяДата();
	
	Если Период = НСтр("ru='Все время'") Тогда
		
		Объект.ДатаНачалаВыгрузки  = '00010101';
		Объект.ДатаКонцаВыгрузки   = '00010101';
		
	ИначеЕсли Период = "ЗаДату" Тогда
		
		Оповещение = Новый ОписаниеОповещения("ВыполнитьПослеВыбораДаты", ЭтаФорма, );
		ПоказатьВводДаты(Оповещение, ЛокальнаяТекущаяДата, НСтр("ru='Дата отбора платежей'"), ЧастиДаты.Дата);
		Возврат;
		
	ИначеЕсли ТипЗнч(Период) = Тип("Дата") Тогда
		
		Объект.ДатаНачалаВыгрузки  = Период;
		Если ЗначениеЗаполнено(Период) Тогда
			Объект.ДатаКонцаВыгрузки   = КонецДня(Период);
		Иначе
			Объект.ДатаКонцаВыгрузки   = Период;
		КонецЕсли;
		
	ИначеЕсли Период = НСтр("ru='Сегодня'") Тогда
		
		Объект.ДатаНачалаВыгрузки  = ЛокальнаяТекущаяДата;
		Объект.ДатаКонцаВыгрузки   = КонецДня(ЛокальнаяТекущаяДата);
		
	ИначеЕсли Период = НСтр("ru='Три дня'") Тогда
		
		Объект.ДатаНачалаВыгрузки  = ЛокальнаяТекущаяДата - 3 * 24 * 3600;
		Объект.ДатаКонцаВыгрузки   = КонецДня(ЛокальнаяТекущаяДата);
		
	ИначеЕсли Период = НСтр("ru='Неделю'") Тогда
		
		Объект.ДатаНачалаВыгрузки  = ЛокальнаяТекущаяДата - 7 * 24 * 3600;
		Объект.ДатаКонцаВыгрузки   = КонецДня(ЛокальнаяТекущаяДата);
		
	КонецЕсли;
	
	ПериодПриИзмененииНаСервере();
	
	ОбновитьПодвал();
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ЛокальнаяТекущаяДата()
	
	Возврат ТекущаяДатаСеанса();
	
КонецФункции

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

&НаКлиенте
Процедура ВыполнитьПослеВыбораДаты(ВыбраннаяДата, Параметры) Экспорт
	
	ЛокальнаяТекущаяДата = ЛокальнаяТекущаяДата();
	
	Если ЗначениеЗаполнено(ВыбраннаяДата) Тогда
		
		Объект.ДатаНачалаВыгрузки  = НачалоДня(ВыбраннаяДата);
		Объект.ДатаКонцаВыгрузки   = КонецДня(ВыбраннаяДата);
		Период = ВыбраннаяДата;
		
		Массив = Новый Массив;
		Массив.Добавить(Тип("Дата"));
		ОписаниеТиповДата = Новый ОписаниеТипов(Массив, , );
		
		Элементы.Период.ОграничениеТипа = ОписаниеТиповДата;
		
		Элементы.Период.КнопкаВыбора = Истина;
		Элементы.Период.РедактированиеТекста = Истина;
	Иначе
		
		Если ТипЗнч(Период) = Тип("Дата") Тогда
			Возврат;
		КонецЕсли;
		
		Если Объект.ДатаНачалаВыгрузки  = '00010101' И Объект.ДатаКонцаВыгрузки = '00010101' Тогда
			Период = НСтр("ru='Все время'");
		ИначеЕсли Объект.ДатаНачалаВыгрузки = НачалоДня(ЛокальнаяТекущаяДата)
			И Объект.ДатаКонцаВыгрузки = КонецДня(ЛокальнаяТекущаяДата) Тогда
			Период = НСтр("ru='Сегодня'");
		ИначеЕсли Объект.ДатаНачалаВыгрузки = НачалоДня(ЛокальнаяТекущаяДата) - 3 * 24 * 3600
			И Объект.ДатаКонцаВыгрузки = КонецДня(ЛокальнаяТекущаяДата) Тогда
			Период = НСтр("ru='Три дня'");
		ИначеЕсли Объект.ДатаНачалаВыгрузки = НачалоДня(ЛокальнаяТекущаяДата) - 7 * 24 * 3600
			И Объект.ДатаКонцаВыгрузки = КонецДня(ЛокальнаяТекущаяДата) Тогда
			Период = НСтр("ru='Неделю'");
		КонецЕсли;
	КонецЕсли;
	
	ПериодПриИзмененииНаСервере();
	
	ОбновитьПодвал();
	
КонецПроцедуры

&НаСервере
Процедура ПериодПриИзмененииНаСервере()
	
	ОбновитьСписокПлатежей();
	
КонецПроцедуры

&НаКлиенте
Процедура ТолькоНеВыгруженныеПриИзменении(Элемент)
	
	Объект.ТолькоНевыгруженные = (ТолькоНевыгруженные = 1);
	
	ОбновитьСписокПлатежей();
	
	ОбновитьПодвал();
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ТекстДиректБанкГоризонтальноОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	
	//++ Локализация
	ОбменСБанкамиКлиент.ОбработкаНавигационнойСсылкиРекламыДиректБанк(НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка);
	//-- Локализация
	Возврат;
	
КонецПроцедуры

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

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

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

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

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

&НаСервере
Процедура ОбновитьСписокСчетовНаСервере()
	
	ЗаполнитьТаблицуСчетов();
	
	// Отмеченные счета сохраняют отметку
	МассивНайденныхСчетов = Новый Массив;
	Для каждого Счет Из Объект.БанковскиеСчета Цикл
		СчетСписка = Объект.СписокСчетов.НайтиПоЗначению(Счет.Ссылка);
		Если СчетСписка <> Неопределено Тогда
			Счет.Пометка = Истина;
			МассивНайденныхСчетов.Добавить(СчетСписка);
		КонецЕсли;
	КонецЦикла;
	
	МассивНеНайденныхСчетов = Новый Массив;
	Для каждого Счет Из Объект.СписокСчетов Цикл
		Если МассивНайденныхСчетов.Найти(Счет) = Неопределено Тогда
			МассивНеНайденныхСчетов.Добавить(Счет);
		КонецЕсли;
	КонецЦикла;
	
	Для каждого Счет Из МассивНеНайденныхСчетов Цикл
		Объект.СписокСчетов.Удалить(Счет);
	КонецЦикла;
	
	ОбновитьСписокПлатежей();
	
КонецПроцедуры

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

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

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

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

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

&НаКлиенте
Процедура Выгрузить(Команда)
	
	ОчиститьСообщения();
	МассивДокументовПрямойОбмен = Новый Массив;
	
	//++ Локализация


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

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

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

&НаКлиенте
Процедура ПослеУдаленияФайлов(ДополнительныеПараметры) Экспорт
	
	Возврат;
	
КонецПроцедуры

&НаКлиенте
Процедура ВывестиОтчет(Команда)
	
	ИндексыСтрок = Новый Массив;
	Для каждого ВыделеннаяСтрока Из Элементы.БанковскиеСчета.ВыделенныеСтроки Цикл
		ИндексыСтрок.Добавить(Объект.БанковскиеСчета.Индекс(Элементы.БанковскиеСчета.ДанныеСтроки(ВыделеннаяСтрока)));
	КонецЦикла;
	
	ТаблицаОтчетОВыгрузке = ВывестиОтчетНаСервере(ИндексыСтрок);
	
	Если ТаблицаОтчетОВыгрузке <> Неопределено Тогда
		ТаблицаОтчетОВыгрузке.ТолькоПросмотр = Истина;
		ТаблицаОтчетОВыгрузке.Показать(НСтр("ru='Отчет о выгрузке платежей'"));
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция ВывестиОтчетНаСервере(ИндексыСтрок)
	
	Обработка = РеквизитФормыВЗначение("Объект");
	Возврат Обработка.ПечатьОтчетаОВыгрузке(ИндексыСтрок);
	
КонецФункции

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

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

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

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

&НаСервере
Процедура ЗаполнитьТаблицуСчетов()
	
	Обработка = РеквизитФормыВЗначение("Объект");
	Обработка.ЗаполнитьТаблицуСчетовВыгрузки();
	ЗначениеВРеквизитФормы(Обработка, "Объект");
	
	МассивСчетов = Объект.БанковскиеСчета.Выгрузить().ВыгрузитьКолонку("Ссылка");
	ДополнитьТаблицуСчетовКоличествомДокументовКВыгрузке(МассивСчетов);
	
КонецПроцедуры

&НаСервере
Процедура ДополнитьТаблицуСчетовКоличествомДокументовКВыгрузке(МассивСчетов)
	
	Запрос = Новый Запрос;
	Запрос.Текст = "
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ДанныеДокумента.БанковскийСчет КАК БанковскийСчет,
	|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеДокумента.Ссылка) КАК Количество
	|ИЗ
	|	Документ.СписаниеБезналичныхДенежныхСредств КАК ДанныеДокумента
	|ГДЕ
	|	ДанныеДокумента.Проведен
	|	И НЕ ДанныеДокумента.ПроведеноБанком
	|	И ДанныеДокумента.ТипПлатежногоДокумента В (
	|		ЗНАЧЕНИЕ(Перечисление.ТипыПлатежныхДокументов.ПлатежноеПоручение)
	//++ Локализация
	|		, ЗНАЧЕНИЕ(Перечисление.ТипыПлатежныхДокументов.РаспоряжениеОбОбязательнойПродаже)
	//-- Локализация
	|	)
	|	И ДанныеДокумента.БанковскийСчет В (&МассивСчетов)
	|	И ДанныеДокумента.ДатаВыгрузки = ДАТАВРЕМЯ(1,1,1)
	|	
	|СГРУППИРОВАТЬ ПО
	|	ДанныеДокумента.БанковскийСчет
	|	
	|ОБЪЕДИНИТЬ ВСЕ
	|	
	|ВЫБРАТЬ
	|	ДанныеДокумента.БанковскийСчет КАК БанковскийСчет,
	|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеДокумента.Ссылка) КАК Количество
	|ИЗ
	|	Документ.ПоступлениеБезналичныхДенежныхСредств КАК ДанныеДокумента
	|ГДЕ
	|	ДанныеДокумента.Проведен
	|	И НЕ ДанныеДокумента.ПроведеноБанком
	|	И ДанныеДокумента.ТипПлатежногоДокумента = ЗНАЧЕНИЕ(Перечисление.ТипыПлатежныхДокументов.ПлатежноеТребование)
	|	И ДанныеДокумента.БанковскийСчет В (&МассивСчетов)
	|	И ДанныеДокумента.ДатаВыгрузки = ДАТАВРЕМЯ(1,1,1)
	|	
	|СГРУППИРОВАТЬ ПО
	|	ДанныеДокумента.БанковскийСчет
	|";
	
	Запрос.УстановитьПараметр("МассивСчетов", МассивСчетов);
	
	Результат = Запрос.Выполнить();
	Если Результат.Пустой() Тогда
		Возврат;
	КонецЕсли;
	
	Таблица = Результат.Выгрузить();
	Таблица.Свернуть("БанковскийСчет", "Количество");
	
	Для каждого Счет Из Объект.БанковскиеСчета Цикл
		СтрокаКоличества = Таблица.Найти(Счет.Ссылка, "БанковскийСчет");
		Если СтрокаКоличества <> Неопределено Тогда
			Счет.КВыгрузке = СтрокаКоличества.Количество;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

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

&НаСервере
Процедура ЗаполнитьСписокВыбораПериодов()
	
	СписокВыбораПериода = Элементы.Период.СписокВыбора;
	
	СписокВыбораПериода.Добавить(НСтр("ru='Все время'"),     НСтр("ru='Все время'"));
	СписокВыбораПериода.Добавить("Дату",                     НСтр("ru='Дату...'"));
	СписокВыбораПериода.Добавить(НСтр("ru='Сегодня'"),       НСтр("ru='Сегодня'"));
	СписокВыбораПериода.Добавить(НСтр("ru='Три дня'"),       НСтр("ru='Три дня'"));
	СписокВыбораПериода.Добавить(НСтр("ru='Неделю'"),        НСтр("ru='Неделю'"));
	
	// Начальные установки
	Период = НСтр("ru='Все время'");
	Объект.ДатаНачалаВыгрузки = '00010101';
	Объект.ДатаКонцаВыгрузки = '00010101';
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьПометкуСчета()
	
	ОбработатьПометкуСчетаСервер();
	
	ОбновитьПодвал();

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

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


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

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

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

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

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

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

&НаКлиенте
Процедура СформироватьСтрокуСуммыКВыгрузке()
	
	СуммаКВыгрузке = "";
	Если СуммыПлатежейКВыгрузке.Количество() Тогда
		Для каждого СуммаПлатежей Из СуммыПлатежейКВыгрузке Цикл
			Если ЗначениеЗаполнено(СуммаПлатежей.Значение) Тогда
				СуммаКВыгрузке = СуммаКВыгрузке + Формат(СуммаПлатежей.Значение, "ЧДЦ=2") + " " + Строка(СуммаПлатежей.Ключ) + ", ";
			КонецЕсли;
		КонецЦикла;
		СуммаКВыгрузке = Лев(СуммаКВыгрузке, СтрДлина(СуммаКВыгрузке) - 2);
		СуммаКВыгрузке = НСтр("ru = 'На сумму:'") + " " + ?(СуммаКВыгрузке = "", "-", СуммаКВыгрузке);
	Иначе
		СуммаКВыгрузке = НСтр("ru = 'На сумму: -'")
	КонецЕсли;
	
КонецПроцедуры

//++ Локализация
&НаКлиенте
Процедура ПослеСозданияНастройкиЭДО(НастройкаЭДО, Параметры) Экспорт
	
	Возврат;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ВыборФайлаПриВыгрузке(Счет)
	
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	Если Счет.ФорматОбмена = ПредопределенноеЗначение("Перечисление.ФорматОбменаСБанком.ISO20022") Тогда
		ДиалогВыбораФайла.Фильтр              = НСтр("ru='XML файл (*.xml)|*.xml'");
		ДиалогВыбораФайла.Расширение          = "xml";
	ИначеЕсли Счет.ФорматОбмена = ПредопределенноеЗначение("Перечисление.ФорматОбменаСБанком.ClientBankExchange1c")
		ИЛИ Счет.ФорматОбмена = ПредопределенноеЗначение("Перечисление.ФорматОбменаСБанком.MT940") Тогда
		ДиалогВыбораФайла.Фильтр              = НСтр("ru='Текстовый файл (*.txt)|*.txt'");
		ДиалогВыбораФайла.Расширение          = "txt";
	ИначеЕсли Счет.ФорматОбмена = ПредопределенноеЗначение("Перечисление.ФорматОбменаСБанком.ФедеральноеКазначействоРФ") Тогда
		ДиалогВыбораФайла.Фильтр              = НСтр("ru='Zip-архив (*.zip)|*.zip'");
		ДиалогВыбораФайла.Расширение          = "zip";
	КонецЕсли;
	ДиалогВыбораФайла.Заголовок               =
		СтрШаблон(НСтр("ru='Укажите имя файла для выгрузки данных по счету %1'"), Строка(Счет.Ссылка));
	ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
	ДиалогВыбораФайла.ИндексФильтра           = 0;
	ДиалогВыбораФайла.ПолноеИмяФайла          = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
	ДиалогВыбораФайла.ПроверятьСуществованиеФайла = Ложь;
	
	ДопПараметры = Новый Структура;
	ДопПараметры.Вставить("ИдСчета", Счет.ПолучитьИдентификатор());
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ВыборФайлаПриВыгрузкеЗавершение", ЭтаФорма, ДопПараметры);
	ДиалогВыбораФайла.Показать(ОписаниеОповещения);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ВыборФайлаОбменаСБанком(ТекущиеДанные)
	
	Если ТекущиеДанные.ПрямойОбмен Тогда
		ИмяФайла = "";
	Иначе
		
		Если ТекущиеДанные.ЗагружатьКаталог Тогда
			ИмяФайла = "";
		Иначе
			ИмяФайла = ТекущиеДанные.НастройкаОбмена;
		КонецЕсли;
		
	КонецЕсли;
	
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Если ТекущиеДанные.ФорматОбмена = ПредопределенноеЗначение("Перечисление.ФорматОбменаСБанком.ISO20022") Тогда
		ДиалогВыбораФайла.Фильтр              = НСтр("ru='XML файл (*.xml)|*.xml'");
		ДиалогВыбораФайла.Расширение          = "xml";
	ИначеЕсли ТекущиеДанные.ФорматОбмена = ПредопределенноеЗначение("Перечисление.ФорматОбменаСБанком.ФедеральноеКазначействоРФ") Тогда
		ДиалогВыбораФайла.Фильтр              = НСтр("ru='Zip-архив (*.zip)|*.zip'");
		ДиалогВыбораФайла.Расширение          = "zip";
	Иначе
		ДиалогВыбораФайла.Фильтр              = НСтр("ru='Текстовый файл (*.txt)|*.txt'");
		ДиалогВыбораФайла.Расширение          = "txt";
	КонецЕсли;
	ДиалогВыбораФайла.Заголовок               = НСтр("ru='Укажите имя файла для выгрузки данных'");
	ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
	ДиалогВыбораФайла.ИндексФильтра           = 0;
	ДиалогВыбораФайла.ПолноеИмяФайла          =
		?(ПустаяСтрока(ИмяФайла), СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", ""), ИмяФайла);
	ДиалогВыбораФайла.ПроверятьСуществованиеФайла = Ложь;
	
	ОписаниеОповещения = Новый ОписаниеОповещения(
		"ВыборФайлаЗавершение",
		ЭтотОбъект,
		Новый Структура("ТекущиеДанные", ТекущиеДанные));
	
	ДиалогВыбораФайла.Показать(ОписаниеОповещения);
	
КонецПроцедуры

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

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

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

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

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

&НаКлиенте
Процедура ВыгрузитьФайлНаКлиентеПроверкаНаКаталог(ЭтоКаталог, ДополнительныеПараметры) Экспорт
	
	Счет = ДополнительныеПараметры.Счет;
	
	ИмяФайла = Счет.НастройкаОбмена;
	
	Если Прав(СокрЛП(Счет.НастройкаОбмена), 1) = "\"
		Или Прав(СокрЛП(Счет.НастройкаОбмена), 1) = "/"
		Или ЭтоКаталог Тогда
		
		Расширение = "";
		
		Если Счет.ФорматОбмена = ПредопределенноеЗначение("Перечисление.ФорматОбменаСБанком.ISO20022") Тогда
			Расширение = ".xml";
		ИначеЕсли Счет.ФорматОбмена = ПредопределенноеЗначение("Перечисление.ФорматОбменаСБанком.ClientBankExchange1c") Тогда
			Расширение = ".txt";
		ИначеЕсли Счет.ФорматОбмена = ПредопределенноеЗначение("Перечисление.ФорматОбменаСБанком.ФедеральноеКазначействоРФ") Тогда
			Расширение = ".zip";
		КонецЕсли;
		
		ИмяФайла = Счет.НастройкаОбмена
				+ ?(Прав(СокрЛП(Счет.НастройкаОбмена), 1) = "\" Или Прав(СокрЛП(Счет.НастройкаОбмена), 1) = "/", "", "\")
				+ СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "")
				+ Расширение;
		
	КонецЕсли;
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ВыгрузитьФайлНаКлиентеЗавершение", ЭтотОбъект, ДополнительныеПараметры);
	ФайловаяСистемаКлиент.СохранитьФайл(ОписаниеОповещения, Счет.АдресХранилищаФайла, ИмяФайла);
	
КонецПроцедуры

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

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


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

#Область РаботаСФайлами

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

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

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

&НаКлиенте
Процедура ВыбратьФайлПриВыгрузкеЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	ВозможностьВыбораФайлов = Результат;
	
	Если ВозможностьВыбораФайлов Тогда
		ВыборФайлаПриВыгрузке(ДополнительныеПараметры);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

&НаКлиенте
Функция ТекстыАрхиваВыгрузкиСтрокой(Знач АдресИсходныхДанных)
	
	#Если ВебКлиент ИЛИ МобильныйКлиент Тогда
		Возврат "";
	#Иначе
		
		ТекстФайлаВыгрузкиСтрокой = "";
		ДвоичныеДанныеИсходногоФайла = ПолучитьИзВременногоХранилища(АдресИсходныхДанных);
		ТекстФайлаВыгрузкиСтрокой = Base64Строка(ДвоичныеДанныеИсходногоФайла);
		
		Возврат ТекстФайлаВыгрузкиСтрокой;
	#КонецЕсли
	
КонецФункции

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

&НаКлиенте
Процедура ЗапуститьПроверкуПовторно(Результат, ДополнительныеПараметры) Экспорт
	
	Если Не ПроверкаВыполняется Тогда
		Возврат;
	КонецЕсли;
	
	СчетчикПроверок = СчетчикПроверок - 1;
	
	Если Результат = "ПроверкаВыполненаУспешно" Тогда
		
		Если СчетчикПроверок = 0 Тогда
			#Если ВебКлиент Тогда
				Интервал = 0.5;
			#Иначе
				ГСЧ = Новый ГенераторСлучайныхЧисел();
				Делитель = ГСЧ.СлучайноеЧисло(1, 10);
				Интервал = Окр(2 / Делитель, 1);
			#КонецЕсли
			ПодключитьОбработчикОжидания("Подключаемый_ПроверитьФайлыВыгрузки", Интервал, Истина);
		КонецЕсли;
		
	ИначеЕсли Результат = "ФайлыИзменены" Тогда
		
		ПроверкаВыполняется = Ложь;
		СчетчикПроверок = 0;
		ОтключитьОбработчикОжидания("Подключаемый_ПроверитьФайлыВыгрузки");
		
		ПараметрыПроверки = Новый Структура;
		ПараметрыПроверки.Вставить("Результат", Результат);
		
		ОткрытьФорму("Обработка.КлиентБанк.Форма.КонтрольБезопасностиВыгрузкиВФайл",
			ПараметрыПроверки,
			ЭтотОбъект,
			"КонтрольБезопасностиВыгрузкиВФайл",,,,
			РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ПроверитьФайлыНаКлиентеЭтоКаталог(ЭтоКаталог, ДополнительныеПараметры) Экспорт
	
	Если Не ЭтоКаталог Тогда
		ПроверитьФайлНаКлиенте(ДополнительныеПараметры.Счет, ДополнительныеПараметры.ОповещениеПослеПроверки)
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

СуммыПлатежейКВыгрузке = Новый Соответствие;

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

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