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