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

файл

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа
		Возврат;
	КонецЕсли;
	
	УстановитьУсловноеОформление();
	
	//++ Локализация

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

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

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
	
	УстановитьОтборДинамическихСписков();
	
КонецПроцедуры

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

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

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

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

	// ЭлектронноеВзаимодействие.ОбменСБанками
	ОбменСБанкамиКлиент.ОбновитьРекламуДиректБанк(
		ИмяСобытия, Элементы.ГруппаРекламаДиректБанкГоризонтально, Элементы.ТекстДиректБанкГоризонтально);
	// Конец ЭлектронноеВзаимодействие.ОбменСБанками

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

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

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

&НаКлиенте
Процедура ОрганизацияОтборПриИзменении(Элемент)

	ОбновитьСписокБанковскихСчетов();

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

&НаКлиенте
Процедура ВалютаОтборПриИзменении(Элемент)

	ОбновитьСписокБанковскихСчетов();

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

&НаКлиенте
Процедура НомерСчетаОтборПриИзменении(Элемент)

	ОбновитьСписокБанковскихСчетов();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ТолькоПоследняяВыпискаПриИзменении(Элемент)
	
	ОчиститьСообщения();
	ТолькоПоследняяВыпискаПриИзмененииСервер();
	
КонецПроцедуры

&НаСервере
Процедура ТолькоПоследняяВыпискаПриИзмененииСервер()
	
	УстановитьОтборДинамическихСписков();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ОтметитьСчета(Команда)
	
	ОчиститьСообщения();
	УстановитьПометкуПодчиненнымСтрокам(БанковскиеСчета.ПолучитьЭлементы(), Истина);
	ЗаполнитьСписокПомеченныхСчетов();
	
КонецПроцедуры

&НаКлиенте
Процедура СнятьОтметкиСчетов(Команда)
	
	ОчиститьСообщения();
	Объект.СписокСчетов.Очистить();
	
	УстановитьПометкуПодчиненнымСтрокам(БанковскиеСчета.ПолучитьЭлементы(), Ложь);
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура РежимПросмотраСчетовДерево(Команда)
	
	ИзменитьРежимПросмотра(1);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ОткрытьНастройкиЗагрузки(Команда)

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

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

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

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

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

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

&НаСервере
Процедура УстановитьОтображениеДанныхФайлов()

	ЕстьДанныеВыписки = ЗаголовокВыписки.КоличествоСтрок() <> 0;
	ЕстьДанныеЗачисления = ЗаголовокЗачисления.КоличествоСтрок() <> 0;
	
	Элементы.ГруппаДанныеВыписки.Видимость = ЕстьДанныеВыписки
											ИЛИ (Не ЕстьДанныеВыписки
											И Не ЕстьДанныеЗачисления);
	Элементы.ГруппаПодтверждениеЗачисления.Видимость = ЕстьДанныеЗачисления;
	
	Если ЕстьДанныеВыписки
		И ЕстьДанныеЗачисления Тогда
		Элементы.СтраницыДанныеФайлов.ОтображениеСтраниц = ОтображениеСтраницФормы.ЗакладкиСверху;
	Иначе
		Элементы.СтраницыДанныеФайлов.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет;
	КонецЕсли;

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

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьВидимостьПоРежимуОтображенияСчетов(Форма)

	Форма.Элементы.РежимПросмотраСчетовДерево.Видимость =
		Форма.РежимПросмотраСчетов = 0
		И Форма.НесколькоОрганизаций;
	Форма.Элементы.РежимПросмотраСчетовСписок.Видимость =
		Форма.РежимПросмотраСчетов = 1
		И Форма.НесколькоОрганизаций;

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

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

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

&НаКлиенте
Процедура ПрочитатьДанныеВыписки(Счет)
	
	Если Счет.ФорматОбмена = ПредопределенноеЗначение("Перечисление.ФорматОбменаСБанком.ClientBankExchange1c") Тогда
		ПрочитатьДанныеВыписки1CClientBankExchange(Счет);
	Иначе
		ПрочитатьДанныеВыпискиПоФормату(Счет);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

&НаКлиенте
Процедура ВыполнитьПроверкуПередЗагрузкойДокументов()

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

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

&НаСервере
Процедура ПолучитьСчетаСЗапретомИзмененияВЗагружаемомПериоде(СписокСчетов)

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

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

&НаКлиенте
Процедура ЗагрузитьДокументыПослеПроверки()

	ЗагрузитьНаСервере(); // Загрузка из файлов
	
	ЗаполнитьПериодЗагрузкиСчетов(БанковскиеСчета.ПолучитьЭлементы());
	
	Тик = 0;
	ПодключитьОбработчикОжидания("ОбработатьЗавершениеЗагрузки", 1, Истина);

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Функция ЭтоЛицевойСчетБанковскогоСчета(ТекущийСчет, ПроверяемыйСчет)

	Возврат ?(ПроверяемыйСчет.РазделЛицевогоСчета = Неопределено, "", ПроверяемыйСчет.РазделЛицевогоСчета) = ТекущийСчет.РазделЛицевогоСчета
			И ?(ПроверяемыйСчет.НомерЛицевогоСчета = Неопределено, "", ПроверяемыйСчет.НомерЛицевогоСчета) = ТекущийСчет.НомерЛицевогоСчета

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ВывестиОтчетЗавершение()

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

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

&НаКлиенте
Процедура СохранитьНастройкиЗагрузки(Результат, ДополнительныеПараметры) Экспорт

	Если ТипЗнч(Результат) = Тип("Структура") Тогда
		ЗаполнитьЗначенияСвойств(Объект, Результат);
	КонецЕсли;

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

&НаКлиенте
Процедура ОбновитьСписокБанковскихСчетов(ОбновитьСписок = Ложь)

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

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

&НаКлиенте
Функция ВыполняетсяЗагрузка(ЭлементыДерева, ПроизводитсяЗагрузка = Ложь)

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

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

&НаСервере
Функция ОтборСпискаСчетов()

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

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

&НаКлиенте
Процедура ИзменитьРежимПросмотра(Режим)

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

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

&НаСервере
Процедура ЗаполнитьДеревоСчетовПоРежимуОтображения(ОбновитьСписок = Ложь)

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

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

&НаСервере
Процедура ДобавитьНулевойУровеньДерева(СтрокаТаблицы, ДеревоСчетов)

	СтрокаДерева = ДеревоСчетов.Строки.Добавить();
	ЗаполнитьЗначенияСвойств(СтрокаДерева, СтрокаТаблицы);
	СтрокаДерева.Группировка = СтрокаТаблицы.Ссылка;
	СтрокаДерева.Уровень = 0;
	
	Если Объект.СписокСчетов.НайтиПоЗначению(СтрокаДерева.Ссылка) <> Неопределено Тогда
		
		СтрокаДерева.Пометка = Истина;
		
		Если РежимПросмотраСчетов = 1 Тогда
			ДеревоСчетов.Пометка = Истина;
		КонецЕсли;
		
	КонецЕсли;

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

&НаКлиенте
Процедура УстановитьПометкуПодчиненнымСтрокам(ЭлементыДерева, Значение)

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

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

&НаКлиенте
Процедура УстановитьПометкуРодительскойСтроке(СтрокаДерева)

	УзелДерева = СтрокаДерева.ПолучитьРодителя();
	
	Если УзелДерева <> Неопределено Тогда
		
		ЕстьПометка = Ложь;
		
		Для Каждого Ветка Из УзелДерева.ПолучитьЭлементы() Цикл
			Если Ветка.Пометка Тогда
				ЕстьПометка = Истина;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		
		УзелДерева.Пометка = ЕстьПометка;
		
	КонецЕсли;

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

&НаСервере
Процедура ЗаполнитьСписокПомеченныхСчетов()

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

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

&НаКлиенте
Процедура ПрочитатьДанныеВыписокДерева(ЭлементыДерева)

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

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

&НаКлиенте
Процедура ВыделитьОтобранныйСчет(ЭлементыДерева)

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

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

&НаКлиенте
Процедура ЗагрузитьДокументыИзДерева(ЭлементыДерева, Ошибки)

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

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

&НаКлиенте
Процедура ЗагрузитьДокументыСчета(Счет, ЕстьОшибки)

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

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

&НаСервере
Процедура СохранитьВыпискуВоВременноеХранилище(ЭлементыДерева)

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

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

&НаСервере
Процедура ЗаполнитьТаблицуСчетовПоДереву()

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

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

&НаКлиенте
Функция ФайлыПрочитаны(ЭлементыДерева, ВсеФайлыПрочитаны = Истина)

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

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

&НаСервере
Функция СписокБанковскихСчетовСОтбором(Отбор)

	ДеревоБанковскихСчетов = РеквизитФормыВЗначение("БанковскиеСчета");
	
	Возврат ДеревоБанковскихСчетов.Строки.НайтиСтроки(Отбор, Истина);

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

&НаКлиенте
Процедура ЗаполнитьПериодЗагрузкиСчетов(ЭлементыДерева)

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

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

&НаКлиенте
Процедура ПроверитьВыполнениеЗагрузки(ЭлементыДерева, ЕстьЗавершенныеЗагрузки, ЕстьНевыполненныеЗадания)

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

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

&НаКлиенте
Процедура ЗаполнитьРезультатыЗагрузки(ЭлементыДерева, ЗагруженныеСчета, ЗагруженныеПлатежи)

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

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

&НаКлиенте
Процедура ВывестиЗаголовкиВыписокСчета(ДанныеСчета, ТекстСообщения)

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

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

&НаСервере
Процедура ЗаполнитьПериодПоследнейЗагрузки(ТаблицаСчетов, ЭлементыДерева)

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

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

&НаСервере
Функция ЕстьДублиНомераСчетаКонтрагента(Контрагент, НомерСчета)

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

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

&НаСервере
Процедура ВывестиСообщенияПоЗагруженнымПлатежам(ЗагруженныеПлатежи)

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

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

&НаСервере
Функция ТекстОшибкиЗагрузкиПоДокументу(Документ, Ошибка)

	Возврат СтрШаблон(НСтр("ru = '%1:
							|%2%3'"), Документ, Символы.Таб, Ошибка);

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

#Область ПроверкаФоновыхЗаданий

&НаКлиенте
Процедура ПроверитьПараллельнуюЗагрузкуВыписки()

	ОбновитьНаличиеФоновыхЗаданий();

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

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

&НаСервере
Процедура ОбновитьНаличиеФоновыхЗаданийВДереве(ТаблицаФоновыхЗаданий, ЭлементыДерева)

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

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

&НаСервере
Процедура ЗаполнитьСведенияФоновыхЗаданий(ТаблицаФоновыхЗаданий, ДанныеСчета)

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

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

&НаСервере
Функция ВыполняющиесяФоновыеЗаданияПоЗагрузкеВыписки()

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

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

&НаСервере
Процедура ОчиститьСведенияФоновогоЗадания(Счет)

	Счет.ЕстьФоновоеЗадание = Ложь;
	Счет.АвторФоновогоЗадания = "";
	Счет.ПериодЗагрузкиФоновогоЗадания = Новый СтандартныйПериод();

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

&НаСервере
Функция ПреобразоватьДеревоВТаблицу(ДеревоЗначений, СтрокиДерева)

	Таблица = Новый ТаблицаЗначений;
	
	Для Каждого КолонкаДерева Из ДеревоЗначений.Колонки Цикл
		Таблица.Колонки.Добавить(КолонкаДерева.Имя, КолонкаДерева.ТипЗначения);
	КонецЦикла;
	
	Для Каждого СтрокаДерева Из СтрокиДерева Цикл
		
		НоваяСтрока = Таблица.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаДерева);
		
	КонецЦикла;
	
	Возврат Таблица;

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

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

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

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

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

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

&НаКлиенте
Процедура ВыполнитьПроцедуруПослеПроверкиФайловСчета(Счет, ИмяПроцедуры)

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

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

&НаКлиенте
Функция ИнициализироватьПараметрыПроверкиФайла()

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПолучитьСписокФайловВКаталоге(СтруктураПараметров)

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

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

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

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

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

&НаКлиенте
Процедура ПоместитьФайлыВоВременноеХранилище(СписокИменФайлов, ДополнительныеПараметры)

	ПомещаемыеФайлы = Новый Массив;

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

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

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

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

&НаКлиенте
Процедура ВыборФайлаОбменаСБанком(ТекущиеДанные, Режим, РежимДиалога = Неопределено)

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ПрочитатьФайлВыпискиClientBank(ИмяФайла, Кодировка, ТекстСообщения = "")
	
	СтрокиФайла = Новый Массив;
	
	#Если Не ВебКлиент Тогда
	
		ФайлВыписки = Новый Файл(ИмяФайла);
		
		КодировкаФайла = ?(Кодировка = "DOS", "cp866", "windows-1251");
		
		Попытка
			ПотокЧтения = Новый ЧтениеТекста(ИмяФайла, КодировкаФайла,,, Ложь);
			
		Исключение
			
			ТекстСообщения = НСтр("ru='<Не удалось прочитать файл выписки. Убедитесь в корректности файла.>'");
			Возврат Неопределено;
		КонецПопытки;
		
		ТекущаяСтрока = ПотокЧтения.ПрочитатьСтроку();
		Если ТекущаяСтрока = Неопределено Тогда
			ТекстСообщения = НСтр("ru='<Файл выписки не содержит данных.>'");
			Возврат Неопределено;
		Иначе
			Если Лев(Врег(СокрЛП(ТекущаяСтрока)), 20) <> "1CCLIENTBANKEXCHANGE" Тогда
				ТекстСообщения =
					НСтр("ru='<Файл выписки не является файлом обмена, или неверно указана кодировка в настройках обмена банковского счета.>'");
				Возврат Неопределено;
			КонецЕсли;
		КонецЕсли;
		
		Пока ТекущаяСтрока <> Неопределено Цикл
			СтрокиФайла.Добавить(СокрЛП(ТекущаяСтрока));
			ТекущаяСтрока = ПотокЧтения.ПрочитатьСтроку();
		КонецЦикла;
	
	#КонецЕсли
	
	Возврат СтрокиФайла;
	
КонецФункции

&НаКлиенте
Процедура ВыборИсточникаЗагрузки()

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста 
Функция ФайлыСчетаВКаталоге(Счет)

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

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

//++ Локализация
&НаКлиентеНаСервереБезКонтекста
Функция ПрочитатьДанныеФайлаЗачисленияДенежныхСредств(ФайлЗачисления, БанковскийСчет, ИдФормы)

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

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

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

	ПараметрыФайла = Новый Структура;
	ПараметрыФайла.Вставить("ДатаНачалаЗагрузки", '00010101');
	ПараметрыФайла.Вставить("ДатаКонцаЗагрузки", '00010101');
	ПараметрыФайла.Вставить("ИмяФайла", ТекущийФайл.Имя);
	ПараметрыФайла.Вставить("БанковскийСчет", БанковскийСчет);
	ПараметрыФайла.Вставить("Выписка", Новый Структура);
	
	Если ДанныеФайла = Неопределено Тогда
		
		ПараметрыФайла.Выписка.Вставить("ДанныеВыписки", Неопределено);
		ПараметрыФайла.Вставить("АдресХранилищаФайла", ПоместитьВоВременноеХранилище(Неопределено, ИдФормы));
		
	Иначе
	
		ПараметрыФайла.Выписка.Вставить("ДанныеВыписки", ДанныеФайла);
		ПараметрыФайла.ДатаНачалаЗагрузки = ДанныеФайла.Заголовок.ДатаФормирования;
		ПараметрыФайла.ДатаКонцаЗагрузки = ДанныеФайла.Заголовок.ДатаФормирования;
		
		Если ТекущийФайл.ДвоичныеДанные <> Неопределено Тогда
			ПараметрыФайла.Вставить("АдресХранилищаФайла",
								ПоместитьВоВременноеХранилище(ТекущийФайл.ДвоичныеДанные, ИдФормы));
		Иначе
			ПараметрыФайла.Вставить("АдресХранилищаФайла",
								ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ТекущийФайл.ПолноеИмя), ИдФормы));
		КонецЕсли;
	
	КонецЕсли;
	
	ПараметрыФайла.Вставить("ФайлПодтвержденияЗачисления", Истина);
	ПараметрыФайла.Выписка.Вставить("ТекстСообщения", ТекстСообщения);
	
	Возврат ПараметрыФайла;

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

&НаКлиентеНаСервереБезКонтекста
Функция ОписаниеФайла(Файл, ДвоичныеДанные = Неопределено)

	ОписаниеФайла = Новый Структура;
	ОписаниеФайла.Вставить("Имя", Файл.Имя);
	ОписаниеФайла.Вставить("ПолноеИмя", Файл.ПолноеИмя);
	ОписаниеФайла.Вставить("ДвоичныеДанные", ДвоичныеДанные);
	
	Возврат ОписаниеФайла;

КонецФункции
//-- Локализация

// Возвращает список ссылок на строки табличной части "Файлы" по банковскому счету
//
// Параметры:
//  Счет - СправочникСсылка.БанковскиеСчетаОрганизаций - банковский счет организации
//  Файлы - ДанныеФормыКоллекция - данные табличной части "Файлы"
//
// Возвращаемое значение:
//   Массив - список строк табличной части
//
&НаКлиентеНаСервереБезКонтекста
Функция СписокФайловБанковскогоСчета(Счет, Файлы)

	ПараметрыОтбора = Новый Структура("БанковскийСчет", Счет);
	
	Возврат Файлы.НайтиСтроки(ПараметрыОтбора);

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

// Удаляет строки из табличной части "Файлы" по банковскому счету
//
// Параметры:
//  Счет - СправочникСсылка.БанковскиеСчетаОрганизаций - банковский счет организации
//
&НаКлиенте
Процедура УдалитьФайлыБанковскогоСчета(Счет)

	МассивФайлов = СписокФайловБанковскогоСчета(Счет, Объект.Файлы);
	
	Для каждого СтрокаМассива Из МассивФайлов Цикл
		Объект.Файлы.Удалить(СтрокаМассива);
	КонецЦикла;

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

// Возвращает новую заполненную строку табличной части Файлы по данным читаемого файла по формату обмена 1C ClientBankExchange.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения - форма загрузки файла.
//  Счет - ДанныеФормыЭлементКоллекции - строка табличной части БанковскиеСчета.
//  ИмяФайла - Строка - полный путь к загружаемому файлу.
//  ТекущийФайл - Файл - загружаемый файл.
//  ТекстСообщения - Строка - текст, содержащий сообщения об ошибках при чтении файла для загрузки.
//  ЧитатьДокументы - Булево - признак, определяющий выполнение полного чтения файла, в т.ч. информацию по документам.
// 
// Возвращаемое значение:
//  ДанныеФормыЭлементКоллекции - сведения о файле, добавленные в табличную часть Файлы.
//  
&НаКлиентеНаСервереБезКонтекста
Функция СведениеОФайлеПоФорматуОбмена1CClientBankExchange(Форма, Счет, ИмяФайла, ТекущийФайл, ТекстСообщения, ЧитатьДокументы = Истина)

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

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

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция СведениеОФайлеВыпискиПоФормату(Форма, Счет, ТекущийФайл, ДвоичныеДанные = Неопределено)

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

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

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

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

	РазобратьФайлыБанковскогоСчета(
		ДополнительныеПараметры.Счет.ПолучитьИдентификатор(),
		ДополнительныеПараметры.ОписаниеФайлов);

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

&НаСервере
Процедура РазобратьФайлыБанковскогоСчета(ИдентификаторСтроки, ОписаниеФайлов, ЧитатьДокументы = Истина)

	Счет = БанковскиеСчета.НайтиПоИдентификатору(ИдентификаторСтроки);
	
	Для каждого ТекущееОписание Из ОписаниеФайлов Цикл
	
		ДвоичныеДанные = ПолучитьИзВременногоХранилища(ТекущееОписание.Хранение); // ДвоичныеДанные
	
		ТекстСообщения = "";
		
		Если Счет.ФорматОбмена = Перечисления.ФорматОбменаСБанком.ClientBankExchange1c Тогда
		
			ИмяФайла = ПолучитьИмяВременногоФайла();
			ДвоичныеДанные.Записать(ИмяФайла);
			
			ТекущийФайл = Новый Файл(ТекущееОписание.ПолноеИмя);
			
			Если ТекущийФайл.Расширение = ".txt" Тогда
				
				НоваяСтрока = СведениеОФайлеПоФорматуОбмена1CClientBankExchange(
					ЭтотОбъект, Счет, ИмяФайла, ТекущееОписание, ТекстСообщения, ЧитатьДокументы);

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ОшибкаЗаполненияБанком(СтрокиВыписки, ТекстСообщения)

	СекцияДокумента = Ложь;
	НайденТегПлательщикСчет = Ложь;
	НайденТегПолучательСчет = Ложь;
	
	СекцияРасчетныйСчет = Ложь;
	НайденТегНачальныйОстаток = Ложь;
	НайденТегКонечныйОстаток = Ложь;
	
	Для Каждого СтрокаВыписки Из СтрокиВыписки Цикл
		
		Если СекцияРасчетныйСчет Тогда
			
			Если СтрНайти(ВРег(СтрокаВыписки), "НАЧАЛЬНЫЙОСТАТОК=") <> 0 Тогда
				НайденТегНачальныйОстаток = Истина;
			КонецЕсли;
			
			Если СтрНайти(ВРег(СтрокаВыписки), "КОНЕЧНЫЙОСТАТОК=") <> 0 Тогда
				НайденТегКонечныйОстаток = Истина;
			КонецЕсли;
			
			Если СтрНайти(ВРег(СтрокаВыписки), "КОНЕЦРАСЧСЧЕТ") <> 0 Тогда
				
				СекцияРасчетныйСчет = Ложь;
				
				Если Не НайденТегНачальныйОстаток
					И НайденТегКонечныйОстаток Тогда
					ТекстСообщения = ?(ТекстСообщения <> "", ТекстСообщения + Символы.ПС, "") 
						+ ТекстОбОтсутствииОбязательногоТега("НачальныйОстаток");
				КонецЕсли;
				
			КонецЕсли;
			
		КонецЕсли;
		
		Если СтрНайти(ВРег(СтрокаВыписки), "СЕКЦИЯРАСЧСЧЕТ") <> 0 Тогда
			СекцияРасчетныйСчет = Истина;
		КонецЕсли;
		
		Если СекцияДокумента Тогда
			
			Если СтрНайти(ВРег(СтрокаВыписки), "ПЛАТЕЛЬЩИКСЧЕТ=") <> 0 Тогда
				НайденТегПлательщикСчет = Истина;
			КонецЕсли;
			
			Если СтрНайти(ВРег(СтрокаВыписки), "ПОЛУЧАТЕЛЬСЧЕТ=") <> 0 Тогда
				НайденТегПолучательСчет = Истина;
			КонецЕсли;
			
			Если СтрНайти(ВРег(СтрокаВыписки), "КОНЕЦДОКУМЕНТА") <> 0 Тогда
			
				СекцияДокумента = Ложь;
				
				Если Не НайденТегПлательщикСчет Тогда
					ТекстСообщения = ?(ТекстСообщения <> "", ТекстСообщения + Символы.ПС, "") 
						+ ТекстОбОтсутствииОбязательногоТега("ПлательщикСчет");
				КонецЕсли;
				
				Если Не НайденТегПолучательСчет Тогда
					ТекстСообщения = ?(ТекстСообщения <> "", ТекстСообщения + Символы.ПС, "")
						+ ТекстОбОтсутствииОбязательногоТега("ПолучательСчет");
				КонецЕсли;
				
				Если Не НайденТегПлательщикСчет
					Или Не НайденТегПолучательСчет Тогда
					Возврат Истина;
				КонецЕсли;
			
			КонецЕсли;
			
		КонецЕсли;
		
		Если СтрНайти(ВРег(СтрокаВыписки), "СЕКЦИЯДОКУМЕНТ=") <> 0 Тогда
			СекцияДокумента = Истина;
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Ложь;

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

&НаКлиентеНаСервереБезКонтекста
Функция ТекстОбОтсутствииОбязательногоТега(ИмяТега)

	Возврат СтрШаблон(НСтр("ru = '<Отсутствует обязательный реквизит %1>'"), ИмяТега);

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

&НаКлиенте
Функция ОбщиеСведенияОЗагруженномФайле()

	ПараметрыФайла = Новый Структура;
	ПараметрыФайла.Вставить("ФайлПодтвержденияЗачисления", Ложь);
	ПараметрыФайла.Вставить("АдресХранилищаДокументов", Неопределено);
	
	Возврат ПараметрыФайла;

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

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

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

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