#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ОписаниеПеременных
Перем КорневойЭлементМанифеста;
Перем ИмяФайлаМанифеста;
Перем КаталогВыгрузкиПодтверждающихДокументов;
Перем ПоддержкаПлатежейВСоответствииС275ФЗ;
#КонецОбласти
#Область ПрограммныйИнтерфейс
#Область Выгрузка
Процедура ЗаполнитьТаблицуСчетовВыгрузки() Экспорт
ТаблицаСчетов = Обработки.КлиентБанк.ТаблицаСчетов(Неопределено);
ДополнитьТаблицуСчетовПоддержкойПрямогоОбмена(ТаблицаСчетов);
БанковскиеСчета.Загрузить(ТаблицаСчетов);
КонецПроцедуры
Процедура ВыгрузитьПлатежи(ИдФормы = "") Экспорт
Отбор = Новый Структура("Пометка", Истина);
ВыгружаемыеБанковскиеСчета = БанковскиеСчета.Выгрузить(БанковскиеСчета.НайтиСтроки(Отбор));
ИнформацияОбОбъединенииФайлов = ИнформацияОбОбъединенииФайлов(ВыгружаемыеБанковскиеСчета);
Если ИнформацияОбОбъединенииФайлов.СчетаБезПравил.Количество() <> 0 Тогда
Для каждого Счет Из ИнформацияОбОбъединенииФайлов.СчетаБезПравил Цикл
Если Не Счет.Пометка
Или Не ЗначениеЗаполнено(Счет.НастройкаОбмена)
Или Счет.Выгружается
Или Счет.ПрямойОбмен
Тогда
Продолжить;
КонецЕсли;
ВыгрузитьПлатежиПоСчету(Счет, ИдФормы);
КонецЦикла;
КонецЕсли;
Если ИнформацияОбОбъединенииФайлов.КоличествоСчетовВПравиле.Количество() <> 0 Тогда
ВыгрузитьПлатежиПорциямиПоПравилам(ИнформацияОбОбъединенииФайлов, ИдФормы);
КонецЕсли;
ОбновитьИнформациюОВыгруженныхФайлах(ИнформацияОбОбъединенииФайлов);
Если ПоддержкаПлатежейВСоответствииС275ФЗ
И ЗначениеЗаполнено(КаталогВыгрузкиПодтверждающихДокументов) Тогда
ВыгрузитьПодтверждающиеДокументы();
КонецЕсли;
КонецПроцедуры
Процедура ВыгрузитьПлатежиПорциямиПоПравилам(ИнформацияОбОбъединенииФайлов, ИдФормы = "") Экспорт
ПотокиВыгрузки = ИнформацияОбОбъединенииФайлов.ПотокиВыгрузки;
КоличествоСчетовВПравиле = ИнформацияОбОбъединенииФайлов.КоличествоСчетовВПравиле;
Для Каждого ПотокВыгрузки Из ПотокиВыгрузки Цикл
СтрокиКВыгрузке = ДокументыКВыгрузкеПоСчетам(ПотокВыгрузки.Счета);
Если СтрокиКВыгрузке.Количество() Тогда
ПараметрыВыгрузки = Новый Структура;
ПараметрыВыгрузки.Вставить("БанковскийСчет", ПотокВыгрузки.Счета[0].Ссылка);
ПараметрыВыгрузки.Вставить("НастройкаОбмена", ПотокВыгрузки.Правило);
ПараметрыВыгрузки.Вставить("Кодировка", ПотокВыгрузки.Счета[0].Кодировка);
ПараметрыВыгрузки.Вставить("Программа", ПотокВыгрузки.Счета[0].Программа);
ПараметрыВыгрузки.Вставить("ФорматОбмена", ПотокВыгрузки.Счета[0].ФорматОбмена);
ПараметрыВыгрузки.Вставить("ВерсияФорматаВыгрузки", ПотокВыгрузки.Счета[0].ВерсияФорматаВыгрузки);
ТаблицаДокументов = ДокументыКВыгрузке.Выгрузить(СтрокиКВыгрузке);
ПараметрыВыгрузки.Вставить("ТаблицаДокументов", ТаблицаДокументов);
ИзменитьРеквизитыСчетовПотока(ПотокВыгрузки.Счета,
Новый Структура("Выгружен, АдресХранилищаДокументов", Ложь, ПоместитьВоВременноеХранилище(ТаблицаДокументов, ИдФормы)));
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(ИдФормы);
ПараметрыВыполнения.ОжидатьЗавершение = 0;
ПараметрыВыполнения.НаименованиеФоновогоЗадания =
НСтр("ru = 'Выгрузка платежей в банк'");
Результат = ДлительныеОперации.ВыполнитьВФоне(
"Обработки.КлиентБанк.Выгрузить",
ПараметрыВыгрузки,
ПараметрыВыполнения);
ИзменитьРеквизитыСчетовПотока(ПотокВыгрузки.Счета,
Новый Структура("АдресХранилищаФайла", Результат.АдресРезультата));
Если Результат.Статус = "Выполнено" Тогда
ИзменитьРеквизитыСчетовПотока(ПотокВыгрузки.Счета,
Новый Структура("СохранитьФайл", Истина));
Иначе
ИзменитьРеквизитыСчетовПотока(ПотокВыгрузки.Счета,
Новый Структура("Выгружается, ИдентификаторВыгрузки, ДанныеВыгрузки",
Истина, Результат.ИдентификаторЗадания, ПоместитьВоВременноеХранилище(Результат, ИдФормы)));
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ВыгрузитьПлатежиПоСчету(Счет, ИдФормы = "") Экспорт
Счет.Выгружен = Ложь;
СтрокиКВыгрузке = ДокументыКВыгрузкеПоСчету(Счет);
Если СтрокиКВыгрузке.Количество() Тогда
ПараметрыВыгрузки = Новый Структура;
ПараметрыВыгрузки.Вставить("БанковскийСчет", Счет["Ссылка"]);
ПараметрыВыгрузки.Вставить("НастройкаОбмена", Счет.НастройкаОбмена);
ПараметрыВыгрузки.Вставить("Кодировка", Счет.Кодировка);
ПараметрыВыгрузки.Вставить("Программа", Счет.Программа);
ПараметрыВыгрузки.Вставить("ФорматОбмена", Счет.ФорматОбмена);
ПараметрыВыгрузки.Вставить("ВерсияФорматаВыгрузки", Счет.ВерсияФорматаВыгрузки);
ТаблицаДокументов = ДокументыКВыгрузке.Выгрузить(СтрокиКВыгрузке);
ПараметрыВыгрузки.Вставить("ТаблицаДокументов", ТаблицаДокументов);
Счет.АдресХранилищаДокументов = ПоместитьВоВременноеХранилище(ТаблицаДокументов, ИдФормы);
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(ИдФормы);
ПараметрыВыполнения.ОжидатьЗавершение = 0;
ПараметрыВыполнения.НаименованиеФоновогоЗадания =
НСтр("ru = 'Выгрузка платежей в банк'");
Результат = ДлительныеОперации.ВыполнитьВФоне(
"Обработки.КлиентБанк.Выгрузить",
ПараметрыВыгрузки,
ПараметрыВыполнения);
Счет.АдресХранилищаФайла = Результат.АдресРезультата;
Если Результат.Статус = "Выполнено" Тогда
Счет.СохранитьФайл = Истина;
Иначе
Счет.Выгружается = Истина;
Счет.ИдентификаторВыгрузки = Результат.ИдентификаторЗадания;
Счет.ДанныеВыгрузки = ПоместитьВоВременноеХранилище(Результат, ИдФормы);
КонецЕсли;
КонецЕсли;
Если ПоддержкаПлатежейВСоответствииС275ФЗ
И ЗначениеЗаполнено(КаталогВыгрузкиПодтверждающихДокументов) Тогда
ВыгрузитьПодтверждающиеДокументы(Счет);
КонецЕсли;
КонецПроцедуры
Функция ПечатьОтчетаОВыгрузке(ВыделенныеСтроки) Экспорт
ПолеОтчета = Неопределено;
Для каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл
Если ПолеОтчета = Неопределено Тогда
ПолеОтчета = Новый ТабличныйДокумент;
ПолеОтчета.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
КонецЕсли;
Счет = БанковскиеСчета.Получить(ВыделеннаяСтрока);
Если Счет.Выгружен Тогда
Если ЭтоАдресВременногоХранилища(Счет.АдресХранилищаДокументов) Тогда
ВыгруженныеДокументы = ПолучитьИзВременногоХранилища(Счет.АдресХранилищаДокументов);
Если ВыгруженныеДокументы <> Неопределено Тогда
ОтборПоСчету = Новый Структура("БанковскийСчет", Счет.Ссылка);
ДокументыПоСчету = ВыгруженныеДокументы.Скопировать(ОтборПоСчету);
ВывестиСекциюОтчетаОВыгрузке(ПолеОтчета, ДокументыПоСчету, Счет.Ссылка, Счет.Выгружен);
КонецЕсли;
КонецЕсли;
Иначе
Отбор = Новый Структура;
Отбор.Вставить("Выгружать", Истина);
Отбор.Вставить("БанковскийСчет", Счет.Ссылка);
ДокументыКВыгрузкеПоСчету = ДокументыКВыгрузке.Выгрузить(Отбор);
Если ДокументыКВыгрузкеПоСчету.Количество() Тогда
ВывестиСекциюОтчетаОВыгрузке(ПолеОтчета, ДокументыКВыгрузкеПоСчету, Счет.Ссылка, Счет.Выгружен);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат ПолеОтчета;
КонецФункции
Процедура ЗаписатьДатуВыгрузкиПлатежей() Экспорт
Для каждого Счет Из БанковскиеСчета Цикл
Если Счет.Выгружен Тогда
Если ЭтоАдресВременногоХранилища(Счет.АдресХранилищаДокументов) Тогда
ВыгруженныеДокументы = ПолучитьИзВременногоХранилища(Счет.АдресХранилищаДокументов);
Если ТипЗнч(ВыгруженныеДокументы) = Тип("ТаблицаЗначений") Тогда
Для каждого ВыгруженныйДокумент Из ВыгруженныеДокументы Цикл
ДокументОбъект = ВыгруженныйДокумент["Ссылка"].ПолучитьОбъект();
ДокументОбъект.ДатаВыгрузки = ТекущаяДатаСеанса();
ДокументОбъект.Записать();
КонецЦикла;
КонецЕсли;
КонецЕсли;
РегистрыСведений.ПоследнийОбменСБанками.СоздатьЗапись(Счет.Ссылка, Новый Структура("ДатаВыгрузки", ТекущаяДатаСеанса()));
Счет.ДатаПоследнейВыгрузки = ТекущаяДатаСеанса();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьТаблицуПлатежей(ДокументыОтбор = Неопределено) Экспорт
ТаблицаДокументов = Обработки.КлиентБанк.ТаблицаДокументовКВыгрузке(СписокСчетов,
ДатаНачалаВыгрузки,
ДатаКонцаВыгрузки,
ТолькоНеВыгруженные);
ЗаполнитьИнформациюОПолучателяхПлательщиках(ТаблицаДокументов);
ДокументыКВыгрузке.Загрузить(ТаблицаДокументов);
ДокументыКВыгрузке.Сортировать("Дата");
Если ДокументыОтбор <> Неопределено Тогда
Для Каждого ДокументКВыгрузке Из ДокументыКВыгрузке Цикл
Отбор = Новый Структура("Ссылка", ДокументКВыгрузке.Ссылка);
НайденныеСтроки = ДокументыОтбор.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() = 0 Тогда
ДокументКВыгрузке.Выгружать = Ложь;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ПроверитьДокументыКВыгрузке();
КонецПроцедуры
#КонецОбласти
#Область Загрузка
Процедура ЗаполнитьТаблицуСчетовЗагрузки(Отбор = Неопределено) Экспорт
ТаблицаСчетов = Обработки.КлиентБанк.ТаблицаСчетов(Отбор, Истина);
Для каждого Счет Из ТаблицаСчетов Цикл
Счет.ПоследняяВыписка = Формат(Счет.ДатаНачалаПоследнейЗагрузки, "ДЛФ=Д")
+ " - "
+ Формат(Счет.ДатаКонцаПоследнейЗагрузки, "ДЛФ=Д");
Счет.НомерСчета = СокрЛП(Счет.НомерСчета);
Если Счет.ПрямойОбмен Тогда
Если ЗначениеЗаполнено(Счет.ДатаКонцаПоследнейЗагрузки) Тогда
Счет.ДатаНачалаЗагрузки = Счет.ДатаКонцаПоследнейЗагрузки;
Иначе
Счет.ДатаНачалаЗагрузки = ТекущаяДатаСеанса();
КонецЕсли;
Счет.ДатаКонцаЗагрузки = ТекущаяДатаСеанса();
КонецЕсли;
КонецЦикла;
ДополнитьТаблицуСчетовПоддержкойПрямогоОбмена(ТаблицаСчетов);
БанковскиеСчета.Загрузить(ТаблицаСчетов);
КонецПроцедуры
Процедура ЗагрузитьПлатежи(ИдФормы = "") Экспорт
ЭтоФайловаяБаза = ОбщегоНазначения.ИнформационнаяБазаФайловая();
Для каждого Счет Из БанковскиеСчета Цикл
Если Не Счет.Пометка Или Не ЗначениеЗаполнено(Счет.НастройкаОбмена) Или Счет.Загружается
Или Счет.ПрямойОбмен Тогда
Продолжить;
Иначе
НаУдаление = Новый Массив;
ПараметрыОтбора = Новый Структура("БанковскийСчет", Счет.Ссылка);
СписокФайлов = Файлы.НайтиСтроки(ПараметрыОтбора);
Для Каждого СтрокаФайла Из СписокФайлов Цикл
Если Не ЭтоАдресВременногоХранилища(СтрокаФайла.АдресХранилищаФайла) Тогда
НаУдаление.Добавить(СтрокаФайла);
КонецЕсли;
КонецЦикла;
Для каждого СтрокаМассива Из НаУдаление Цикл
Файлы.Удалить(СтрокаМассива);
КонецЦикла;
КонецЕсли;
ЗагрузитьПлатежиПоСчету(Счет, ИдФормы, ЭтоФайловаяБаза);
КонецЦикла;
КонецПроцедуры
Процедура ЗагрузитьПлатежиПоСчету(Счет, ИдФормы = "", ПоследовательнаяЗагрузка = Ложь) Экспорт
ПараметрыЗагрузки = Новый Структура;
ПараметрыЗагрузки.Вставить("БанковскийСчет", Счет.Ссылка);
ПараметрыЗагрузки.Вставить("ПрямойОбмен", Счет.ПрямойОбмен);
ПараметрыЗагрузки.Вставить("ДатаНачалаЗагрузки", Счет.ДатаНачалаЗагрузки);
ПараметрыЗагрузки.Вставить("ДатаКонцаЗагрузки", Счет.ДатаКонцаЗагрузки);
ПараметрыЗагрузки.Вставить("ФорматОбмена", Счет.ФорматОбмена);
ПараметрыЗагрузки.Вставить("СоздаватьКонтрагентов", СоздаватьКонтрагентов);
ПараметрыЗагрузки.Вставить("ПроводитьДокументы", ПроводитьДокументы);
ПараметрыЗагрузки.Вставить("Кодировка", Счет.Кодировка);
ПараметрыЗагрузки.Вставить("РежимЗаполненияКонтрагентаПоQRПлатежу", РежимЗаполненияКонтрагентаПоQRПлатежу);
Счет.Загружен = Ложь;
ПараметрыОтбора = Новый Структура("БанковскийСчет", Счет.Ссылка);
ДанныеФайлов = Файлы.НайтиСтроки(ПараметрыОтбора);
Для каждого ТекущаяСтрокаФайла Из ДанныеФайлов Цикл
ПараметрыЗагрузки.Вставить("СтрокиВыписки", ПолучитьИзВременногоХранилища(ТекущаяСтрокаФайла.АдресХранилищаФайла));
ПараметрыЗагрузки.Вставить("ДокументыКЗагрузке", ДокументыКЗагрузке.ВыгрузитьКолонки());
ПараметрыЗагрузки.Вставить("ФайлПодтвержденияЗачисления", ТекущаяСтрокаФайла.ФайлПодтвержденияЗачисления);
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(ИдФормы);
КлючЗадания = СтрШаблон("%1_%2_%3_%4_%5_%6",
НСтр("ru='Загрузка выписки банка'"),
Счет.Ссылка.УникальныйИдентификатор(),
Пользователи.ТекущийПользователь().УникальныйИдентификатор(),
Счет.ДатаНачалаЗагрузки,
Счет.ДатаКонцаЗагрузки,
Новый УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru='Загрузка выписки банка'");
ПараметрыВыполнения.КлючФоновогоЗадания = КлючЗадания;
ПараметрыВыполнения.ОжидатьЗавершение =
?(ПоследовательнаяЗагрузка, Неопределено, ПараметрыВыполнения.ОжидатьЗавершение);
Результат = ДлительныеОперации.ВыполнитьВФоне(
"Обработки.КлиентБанк.Загрузить",
ПараметрыЗагрузки,
ПараметрыВыполнения);
ТекущаяСтрокаФайла.АдресХранилищаДокументов = Результат.АдресРезультата;
Если Результат.Статус = "Ошибка" Тогда
Обработки.КлиентБанк.ВывестиОшибкуЗагрузкиФайла(
Счет.Ссылка, ТекущаяСтрокаФайла.ИмяФайла, Результат.ИнформацияОбОшибке);
КонецЕсли;
Если Результат.Статус <> "Ошибка" Тогда
Счет.Загружается = Истина;
КонецЕсли;
Если Результат.Статус <> "Выполняется" Тогда
ТекущаяСтрокаФайла.СохранитьФайл = Истина;
Иначе
ТекущаяСтрокаФайла.ИдентификаторЗагрузки = Результат.ИдентификаторЗадания;
КонецЕсли;
Счет.ДанныеЗагрузки = ОбщегоНазначения.ЗначениеВСтрокуXML(Результат);
КонецЦикла;
Отбор = Новый Структура("БанковскийСчет, СохранитьФайл", Счет.Ссылка, Ложь);
НеЗагруженныеФайлы = Файлы.НайтиСтроки(Отбор);
Если НеЗагруженныеФайлы.Количество() = 0 Тогда
Счет.Пометка = Ложь;
КонецЕсли;
КонецПроцедуры
Функция ПечатьОтчетаОЗагрузке(ВыделенныеСтроки) Экспорт
ПолеОтчета = Неопределено;
Для каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл
Счет = БанковскиеСчета.Получить(ВыделеннаяСтрока);
ПараметрыОтбора = Новый Структура("БанковскийСчет", Счет.Ссылка);
СписокФайлов = Файлы.НайтиСтроки(ПараметрыОтбора);
ЗагруженныеДокументыПоСчету = ДокументыКЗагрузке.ВыгрузитьКолонки();
Для Каждого ДанныеФайла Из СписокФайлов Цикл
Если ЭтоАдресВременногоХранилища(ДанныеФайла.АдресХранилищаДокументов) Тогда
ЗагруженныеДокументыПоФайлу = ПолучитьИзВременногоХранилища(ДанныеФайла.АдресХранилищаДокументов);
Если ЗагруженныеДокументыПоФайлу <> Неопределено
И ТипЗнч(ЗагруженныеДокументыПоФайлу) = Тип("ТаблицаЗначений")
И ЗагруженныеДокументыПоФайлу.Количество() Тогда
ОбщегоНазначенияУТ.ДобавитьСтрокиВТаблицу(ЗагруженныеДокументыПоСчету, ЗагруженныеДокументыПоФайлу);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ЗагруженныеДокументыПоСчету.Количество() Тогда
Если ПолеОтчета = Неопределено Тогда
ПолеОтчета = Новый ТабличныйДокумент;
ПолеОтчета.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
КонецЕсли;
ВывестиСекциюОтчетаОЗагрузке(ПолеОтчета, ЗагруженныеДокументыПоСчету, Счет.Ссылка, Счет.Загружен);
КонецЕсли;
КонецЦикла;
Возврат ПолеОтчета;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область ВыгрузкаПодтверждающихДокументов
Процедура ВыгрузитьПодтверждающиеДокументы(СчетКВыгрузке = Неопределено)
СоответствиеБанковИСчетов = Новый Соответствие;
Для Каждого БанковскийСчет Из БанковскиеСчета Цикл
Если Не БанковскийСчет.Пометка
Или Не ЗначениеЗаполнено(БанковскийСчет.НастройкаОбмена)
Или БанковскийСчет.Выгружается
Или БанковскийСчет.ПрямойОбмен Тогда
Продолжить;
КонецЕсли;
Если СчетКВыгрузке <> Неопределено И БанковскийСчет.Ссылка <> СчетКВыгрузке["Ссылка"] Тогда
Продолжить;
КонецЕсли;
СчетаБанка = СоответствиеБанковИСчетов[БанковскийСчет.Банк];
Если СчетаБанка = Неопределено Тогда
СчетаБанка = Новый Массив;
КонецЕсли;
СчетаБанка.Добавить(БанковскийСчет);
СоответствиеБанковИСчетов.Вставить(БанковскийСчет.Банк, СчетаБанка);
КонецЦикла;
Для Каждого СчетаБанка Из СоответствиеБанковИСчетов Цикл
ДокументыКВыгрузкеПоБанку = ДокументыКВыгрузкеПоБанку(СоответствиеБанковИСчетов, СчетаБанка.Ключ);
Если ДокументыКВыгрузкеПоБанку.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
МанифестБанка = МанифестПоУмолчанию();
ДобавитьИнформациюОПлатеже(МанифестБанка, ДокументыКВыгрузкеПоБанку);
ЗаписатьПодтверждающиеДокументы(МанифестБанка, СчетаБанка.Ключ);
КонецЦикла;
КонецПроцедуры
Процедура ЗаписатьПодтверждающиеДокументы(Манифест, Банк)
КаталогВременныхФайлов = ОбщегоНазначения.СоздатьВременныйКаталог("embdatatmp");
КаталогПеремещенныхФайлов = КаталогВременныхФайлов + "_temp\";
ПроверитьСоздатьКаталог(КаталогПеремещенныхФайлов);
ПеремещаемыеФайлы = Новый ТаблицаЗначений;
ПеремещаемыеФайлы.Колонки.Добавить("ИсходноеПолноеИмя");
ПеремещаемыеФайлы.Колонки.Добавить("ПолноеИмяПослеПеремещения");
Если ТипЗнч(Банк) = Тип("Строка") Тогда
НаименованиеБанка = Банк;
КодБанка = "";
Иначе
ДанныеБанка = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Банк, "Наименование, Код");
НаименованиеБанка = СокрЛП(ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ДанныеБанка.Наименование));
КодБанка = ДанныеБанка.Код;
КонецЕсли;
МаксРазмерОтдельногоФайла = (1024 * 1024) * Константы.МаксимальныйРазмерФайлаПодтверждающегоДокумента.Получить();
МаксРазмерАрхива = (1024 * 1024) * Константы.МаксимальныйРазмерФайлаАрхиваПодтверждающихДокументов.Получить();
Если ЗначениеЗаполнено(КаталогВыгрузкиПодтверждающихДокументов) Тогда
РезультатЗаписиДокументов = Новый Структура("
|МаксРазмерОтдельногоФайла,
|МаксРазмерАрхива,
|СуммарныйРазмерВБайтах,
|ТребуетсяОптимизацияПоРазмеруАрхива,
|ТаблицаРазмеров");
РезультатЗаписиДокументов.Вставить("МаксРазмерОтдельногоФайла", МаксРазмерОтдельногоФайла);
РезультатЗаписиДокументов.Вставить("МаксРазмерАрхива", МаксРазмерАрхива);
РезультатЗаписиДокументов.Вставить("СуммарныйРазмерВБайтах", 0);
РезультатЗаписиДокументов.Вставить("ТребуетсяОптимизацияПоРазмеруАрхива", Ложь);
РезультатЗаписиДокументов.Вставить("ТаблицаРазмеров", ИнициализацияТаблицыРазмеров());
ЗаписатьФайлыПодтверждающихДокументов(Манифест, КаталогВременныхФайлов, РезультатЗаписиДокументов);
ПорцииЗаписи = ПорцииЗаписи(РезультатЗаписиДокументов, КаталогВременныхФайлов);
Если РезультатЗаписиДокументов.ТребуетсяОптимизацияПоРазмеруАрхива Тогда
МанифестыПоПорциям = МанифестыПоПорциям(Манифест, ПорцииЗаписи);
Иначе
МанифестыПоПорциям = Новый Массив;
МанифестыПоПорциям.Добавить(Манифест);
КонецЕсли;
НомерПорции = 1;
КоличествоПорций = МанифестыПоПорциям.Количество();
Для Каждого МанифестПорции Из МанифестыПоПорциям Цикл
ЗаписатьМанифестБанка(МанифестПорции, КаталогВременныхФайлов, ПорцииЗаписи);
СуффиксПорции = ?(КоличествоПорций > 1, " N" + НомерПорции, "");
ИмяФайла = КодБанка + " " + НаименованиеБанка + СуффиксПорции + ".zip";
ЗаписьАрхива = Новый ЗаписьZipФайла(КаталогВременныхФайлов + ИмяФайла);
Отбор = Новый Структура("НомерПорции", НомерПорции);
НайденныеКаталоги = ПорцииЗаписи.Скопировать(Отбор, "Subfolder");
НайденныеКаталоги.Свернуть("Subfolder");
Для Каждого НайденныйКаталог Из НайденныеКаталоги Цикл
КаталогПеремещенныхФайловПорции = КаталогПеремещенныхФайлов + НайденныйКаталог["Subfolder"] + "\";
ИсходныйКаталогФайлов = КаталогВременныхФайлов + НайденныйКаталог["Subfolder"] + "\";
ПроверитьСоздатьКаталог(КаталогПеремещенныхФайловПорции);
ФайлыКаталога = НайтиФайлы(ИсходныйКаталогФайлов, ПолучитьМаскуВсеФайлы());
ОтборПоКаталогу = Новый Структура("НомерПорции, Subfolder", НомерПорции, НайденныйКаталог["Subfolder"]);
ФайлыКаталогаПорции = ПорцииЗаписи.Скопировать(ОтборПоКаталогу);
Для Каждого ФайлКаталога Из ФайлыКаталога Цикл
Если ФайлыКаталогаПорции.Найти(ФайлКаталога.ПолноеИмя, "ПолноеИмяФайла") = Неопределено Тогда
ПеремещаемыйФайл = ПеремещаемыеФайлы.Добавить();
ПеремещаемыйФайл.ИсходноеПолноеИмя = ФайлКаталога.ПолноеИмя;
ПеремещаемыйФайл.ПолноеИмяПослеПеремещения = КаталогПеремещенныхФайловПорции + ФайлКаталога.Имя;
ПереместитьФайл(ПеремещаемыйФайл.ИсходноеПолноеИмя, ПеремещаемыйФайл.ПолноеИмяПослеПеремещения);
КонецЕсли;
КонецЦикла;
КонецЦикла;
ЗаписьАрхива.Добавить(КаталогВременныхФайлов + "\*.*",
РежимСохраненияПутейZIP.СохранятьОтносительныеПути,
РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
ЗаписьАрхива.Записать();
АдресВременногоХранилища = ПоместитьВоВременноеХранилище(
Новый ДвоичныеДанные(КаталогВременныхФайлов + ИмяФайла), Новый УникальныйИдентификатор);
АдресаХранилищФайловПодтверждающихДокументов.Добавить(АдресВременногоХранилища, ИмяФайла);
Для Каждого ПеремещенныйФайл Из ПеремещаемыеФайлы Цикл
ПереместитьФайл(ПеремещенныйФайл.ПолноеИмяПослеПеремещения, ПеремещенныйФайл.ИсходноеПолноеИмя);
КонецЦикла;
ПеремещаемыеФайлы.Очистить();
НомерПорции = НомерПорции + 1;
КонецЦикла;
КонецЕсли;
УдалитьФайлы(КаталогВременныхФайлов);
КонецПроцедуры
Процедура ЗаписатьФайлыПодтверждающихДокументов(Манифест, КаталогВыгрузки, РезультатЗаписиДокументов)
СуммарныйРазмерВБайтах = 0;
ТаблицаРазмеров = РезультатЗаписиДокументов.ТаблицаРазмеров;
РазделительКаталогов = РазделительКаталогов(КаталогВыгрузки);
КаталогиКЗаписи = Новый Структура;
Для Каждого ДокументКВыгрузке Из Манифест[КорневойЭлементМанифеста]["Doc"] Цикл
ИмяУзлаИдентификаторовВыгрузки = ИмяПеременнойПоИдентификатору(ДокументКВыгрузке["Subfolder"]);
Для Каждого ПодтверждающийДокумент Из ДокументКВыгрузке["embDoc"] Цикл
ИдентификаторыИменаФайлов = Новый Соответствие;
КаталогиКЗаписи.Свойство(ИмяУзлаИдентификаторовВыгрузки, ИдентификаторыИменаФайлов);
Если ИдентификаторыИменаФайлов = Неопределено Тогда
ИдентификаторыИменаФайлов = Новый Соответствие;
КонецЕсли;
ИдентификаторыИменаФайлов.Вставить(
ПодтверждающийДокумент["FileName"]["FileName_Attribute"],
ПодтверждающийДокумент["DocID"]);
КаталогиКЗаписи.Вставить(ИмяУзлаИдентификаторовВыгрузки, ИдентификаторыИменаФайлов);
КонецЦикла;
КонецЦикла;
Для Каждого КаталогКЗаписи Из КаталогиКЗаписи Цикл
ИмяПодкаталогаЗаписи = ИдентификаторПоИмениПеременной(КаталогКЗаписи.Ключ);
КаталогЗаписиДокумента = КаталогВыгрузки + РазделительКаталогов + ИмяПодкаталогаЗаписи + "\";
ПроверитьСоздатьКаталог(КаталогЗаписиДокумента);
Для Каждого ДокументКЗаписи Из КаталогКЗаписи.Значение Цикл
ПолноеИмяФайла = КаталогЗаписиДокумента + ДокументКЗаписи.Ключ;
СсылкаНаФайл = Справочники.ДоговорыКонтрагентовПрисоединенныеФайлы.ПолучитьСсылку(
Новый УникальныйИдентификатор(ДокументКЗаписи.Значение));
Если Не ОбщегоНазначения.СсылкаСуществует(СсылкаНаФайл) Тогда
СсылкаНаФайл = Справочники.ДоговорыКредитовИДепозитовПрисоединенныеФайлы.ПолучитьСсылку(
Новый УникальныйИдентификатор(ДокументКЗаписи.Значение));
КонецЕсли;
Если Не ОбщегоНазначения.СсылкаСуществует(СсылкаНаФайл) Тогда
СсылкаНаФайл = Справочники.ДоговорыМеждуОрганизациямиПрисоединенныеФайлы.ПолучитьСсылку(
Новый УникальныйИдентификатор(ДокументКЗаписи.Значение));
КонецЕсли;
Если Не ОбщегоНазначения.СсылкаСуществует(СсылкаНаФайл) Тогда
Продолжить;
КонецЕсли;
ДанныеФайла = РаботаСФайлами.ДанныеФайла(СсылкаНаФайл, Новый УникальныйИдентификатор, Истина);
Файл = ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла);
Файл.Записать(ПолноеИмяФайла);
НовыйРазмер = ТаблицаРазмеров.Добавить();
НовыйРазмер["Subfolder"] = ИмяПодкаталогаЗаписи;
НовыйРазмер["DocId"] = ДокументКЗаписи.Значение;
НовыйРазмер["СсылкаНаФайл"] = СсылкаНаФайл;
НовыйРазмер["ПолноеИмяФайла"] = ПолноеИмяФайла;
НовыйРазмер["РазмерВБайтах"] = ДанныеФайла.Размер;
СуммарныйРазмерВБайтах = СуммарныйРазмерВБайтах + ДанныеФайла.Размер;
КонецЦикла;
КонецЦикла;
РезультатЗаписиДокументов["СуммарныйРазмерВБайтах"] = СуммарныйРазмерВБайтах;
КонецПроцедуры
Процедура ЗаписатьМанифестБанка(Манифест, КаталогВыгрузки, ПорцииЗаписи)
РазделительКаталогов = РазделительКаталогов(КаталогВыгрузки);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(КаталогВыгрузки + РазделительКаталогов + ИмяФайлаМанифеста);
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписатьЭлементыXML(ЗаписьXML, Манифест[КорневойЭлементМанифеста], КорневойЭлементМанифеста);
ЗаписьXML.Закрыть()
КонецПроцедуры
Функция МанифестыПоПорциям(Знач Манифест, ПорцииЗаписи)
МанифестыПоПорциям = Новый Массив;
НомераПорций = ПорцииЗаписи.Скопировать(,"НомерПорции");
НомераПорций.Свернуть("НомерПорции");
НомераПорцийМассив = НомераПорций.ВыгрузитьКолонку("НомерПорции");
Для Каждого НомерПорции Из НомераПорцийМассив Цикл
МанифестПорции = ОбщегоНазначенияКлиентСервер.СкопироватьСтруктуру(Манифест);
Отбор = Новый Структура("НомерПорции", НомерПорции);
ПорцияЗаписи = ПорцииЗаписи.Скопировать(Отбор);
ДокументыМанифеста = МанифестПорции[КорневойЭлементМанифеста]["Doc"];
ДокументыМанифестаКУдалению = Новый Массив;
Для Каждого ДокументМанифеста Из ДокументыМанифеста Цикл
ФайлыДокумента = ДокументМанифеста["embDoc"];
ФайлыДокументаКУдалению = Новый Массив;
Для Каждого ФайлДокумента Из ФайлыДокумента Цикл
Отбор = Новый Структура("Subfolder, DocId", ДокументМанифеста["Subfolder"], ФайлДокумента["DocID"]);
НайденныеСтроки = ПорцияЗаписи.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() = 0 Тогда
ФайлыДокументаКУдалению.Добавить(ФайлДокумента);
КонецЕсли;
КонецЦикла;
Для Каждого ФайлДокументаКУдалению Из ФайлыДокументаКУдалению Цикл
ИндексКУдалению = ФайлыДокумента.Найти(ФайлДокументаКУдалению);
ФайлыДокумента.Удалить(ИндексКУдалению);
КонецЦикла;
Если ФайлыДокумента.Количество() = 0 Тогда
ДокументыМанифестаКУдалению.Добавить(ДокументМанифеста);
КонецЕсли;
КонецЦикла;
Для Каждого ДокументМанифестаКУдалению Из ДокументыМанифестаКУдалению Цикл
ИндексКУдалению = ДокументыМанифеста.Найти(ДокументМанифестаКУдалению);
ДокументыМанифеста.Удалить(ИндексКУдалению);
КонецЦикла;
МанифестыПоПорциям.Добавить(МанифестПорции);
КонецЦикла;
Возврат МанифестыПоПорциям;
КонецФункции
Функция ПорцииЗаписи(РезультатЗаписиДокументов, КаталогВременныхФайлов)
ПорцииЗаписи = РезультатЗаписиДокументов.ТаблицаРазмеров.Скопировать();
ПорцииЗаписи.Сортировать("Subfolder Возр, РазмерВБайтах Убыв");
ПорцииЗаписи.Колонки.Добавить("НомерПорции");
СуммарныйРазмерВБайтахСжатый = 0;
НомерПорции = 1;
КаталогПроверкиРазмеров = КаталогВременныхФайлов + "ПроверкаРазмера\";
ПроверитьСоздатьКаталог(КаталогПроверкиРазмеров);
ИмяВременногоАрхива = КаталогПроверкиРазмеров + "ПроверочныйФайл.zip";
АрхивЗапись = Новый ЗаписьZipФайла(ИмяВременногоАрхива,,,, УровеньСжатияZIP.Максимальный);
Для Каждого ПорцияЗаписи Из ПорцииЗаписи Цикл
ПорцияЗаписи.НомерПорции = НомерПорции;
Если ПорцииЗаписи.Индекс(ПорцияЗаписи) > 0 Тогда
АрхивЗапись.Открыть(ИмяВременногоАрхива,,,, УровеньСжатияZIP.Максимальный);
КонецЕсли;
АрхивЗапись.Добавить(ПорцияЗаписи.ПолноеИмяФайла);
АрхивЗапись.Записать();
ПроверочныйФайл = Новый Файл(ИмяВременногоАрхива);
СуммарныйРазмерВБайтахСжатый = СуммарныйРазмерВБайтахСжатый + ПроверочныйФайл.Размер();
Если СуммарныйРазмерВБайтахСжатый > РезультатЗаписиДокументов.МаксРазмерАрхива Тогда
ПорцияЗаписи.НомерПорции = ПорцияЗаписи.НомерПорции + 1;
НомерПорции = НомерПорции + 1;
СуммарныйРазмерВБайтахСжатый = ПроверочныйФайл.Размер();
РезультатЗаписиДокументов.ТребуетсяОптимизацияПоРазмеруАрхива = Истина;
КонецЕсли;
КонецЦикла;
УдалитьФайлы(КаталогПроверкиРазмеров);
Возврат ПорцииЗаписи;
КонецФункции
Процедура ЗаписатьЭлементыXML(ЗаписьXML, Элемент, ИмяЭлемента)
Если ТипЗнч(Элемент) = Тип("Структура") Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяЭлемента);
ЗаписатьАтрибутыXML(ЗаписьXML, Элемент);
Для Каждого ЭлементыЭлемента Из Элемент Цикл
ЗаписатьЭлементыXML(ЗаписьXML, ЭлементыЭлемента.Значение, ЭлементыЭлемента.Ключ);
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
ИначеЕсли ТипЗнч(Элемент) = Тип("Массив") Тогда
Для Каждого ЭлементыЭлемента Из Элемент Цикл
ЗаписатьЭлементыXML(ЗаписьXML, ЭлементыЭлемента, ИмяЭлемента);
КонецЦикла;
ИначеЕсли СтрНайти(ИмяЭлемента, "_Attribute") = 0 Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяЭлемента);
ЗаписьXML.ЗаписатьТекст(XMLСтрока(Элемент));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецПроцедуры
Процедура ЗаписатьАтрибутыXML(ЗаписьXML, Элемент)
Для Каждого ЭлементыЭлемента Из Элемент Цикл
Если СтрНайти(ЭлементыЭлемента.Ключ, "_Attribute") > 0 Тогда
ЗаписьXML.ЗаписатьАтрибут(
СтрЗаменить(ЭлементыЭлемента.Ключ, "_Attribute", ""),
XMLСтрока(ЭлементыЭлемента.Значение));
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ДобавитьИнформациюОПлатеже(МанифестБанка, ДокументыКВыгрузкеПоБанку)
Для Каждого Документ Из ДокументыКВыгрузкеПоБанку Цикл
ДокументСсылка = Документ["Ссылка"];
Если Не ТипЗнч(ДокументСсылка) = Тип("ДокументСсылка.СписаниеБезналичныхДенежныхСредств") Тогда
Продолжить;
КонецЕсли;
РеквизитыПлатежа = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДокументСсылка,
"БанковскийСчет.ГосударственныйКонтракт.НомерГОЗ,
|ОплатаПоЗаявкам,
|Номер,
|Дата,
|СуммаДокумента");
Если Не РеквизитыПлатежа.ОплатаПоЗаявкам Тогда
Продолжить;
КонецЕсли;
МанифестДокумента = МанифестДокументаПоУмолчанию();
НомерБезЛидирующихНулей = ПрефиксацияОбъектовКлиентСервер.УдалитьЛидирующиеНулиИзНомераОбъекта(РеквизитыПлатежа.Номер);
МанифестДокумента.Вставить("No", ?(ЗначениеЗаполнено(НомерБезЛидирующихНулей), НомерБезЛидирующихНулей, "0"));
МанифестДокумента.Вставить("Date", XMLДата(РеквизитыПлатежа.Дата));
МанифестДокумента.Вставить("Summ", РеквизитыПлатежа.СуммаДокумента);
МанифестДокумента.Вставить("Subfolder", НомерБезЛидирующихНулей);
ЗаполнитьЗначенияСвойств(МанифестДокумента,
ИдентификаторИПредставлениеТипаПлатежа(ДокументСсылка));
МанифестДокумента.Вставить("IGK", СокрЛП(РеквизитыПлатежа.БанковскийСчетГосударственныйКонтрактНомерГОЗ));
ДокументыКорневогоЭлементаМанифеста = МанифестБанка[КорневойЭлементМанифеста]["Doc"];
ДокументыКорневогоЭлементаМанифеста.Добавить(МанифестДокумента);
ДобавитьИнформациюОПодтверждающихДокументах(МанифестДокумента, ДокументСсылка);
КонецЦикла;
КонецПроцедуры
Процедура ДобавитьИнформациюОПодтверждающихДокументах(МанифестДокумента, ДокументСсылка)
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПодтверждающиеДокументы.Номер КАК Номер,
| ПодтверждающиеДокументы.Дата КАК Дата,
| ПодтверждающиеДокументы.ВидДокумента КАК ВидДокумента,
| ПодтверждающиеДокументы.Файл КАК Файл
|ИЗ
| Документ.СписаниеБезналичныхДенежныхСредств.РасшифровкаПлатежа КАК РасшифровкаПлатежа
| ЛЕВОЕ СОЕДИНЕНИЕ
| Документ.ЗаявкаНаРасходованиеДенежныхСредств.ПодтверждающиеДокументы КАК ПодтверждающиеДокументы
| ПО
| ПодтверждающиеДокументы.Ссылка = РасшифровкаПлатежа.ЗаявкаНаРасходованиеДенежныхСредств
|ГДЕ
| РасшифровкаПлатежа.Ссылка = &ДокументСсылка
| И НЕ ПодтверждающиеДокументы.Файл ЕСТЬ NULL
|";
Запрос.УстановитьПараметр("ДокументСсылка", ДокументСсылка);
ПодтверждающиеДокументы = Запрос.Выполнить().Выгрузить();
ИспользуемыеИменаФайлов = Новый Соответствие;
Для Каждого СтрокаПодтверждающихДокументов Из ПодтверждающиеДокументы Цикл
МанифестПодтверждающегоДокумента = МанифестПодтверждающегоДокументаПоУмолчанию();
МанифестПодтверждающегоДокумента.Вставить("DocId",
Строка(СтрокаПодтверждающихДокументов.Файл.УникальныйИдентификатор()));
МанифестПодтверждающегоДокумента.Вставить("No",
?(ЗначениеЗаполнено(СтрокаПодтверждающихДокументов.Номер), СтрокаПодтверждающихДокументов.Номер, "0"));
МанифестПодтверждающегоДокумента.Вставить("Date", XMLДата(СтрокаПодтверждающихДокументов.Дата));
ЗаполнитьЗначенияСвойств(МанифестПодтверждающегоДокумента,
ИдентификаторИПредставлениеВидаДокумента(СтрокаПодтверждающихДокументов.ВидДокумента));
МанифестПодтверждающегоДокумента.Вставить("FileName",
СвойстваФайла(СтрокаПодтверждающихДокументов.Файл, ИспользуемыеИменаФайлов));
МанифестДокументаДок = МанифестДокумента["embDoc"];
МанифестДокументаДок.Добавить(МанифестПодтверждающегоДокумента);
КонецЦикла;
КонецПроцедуры
Функция ИдентификаторИПредставлениеВидаДокумента(ВидДокумента)
ИдентификаторИПредставлениеВидаДокумента = Новый Структура("IdDoc, DocName");
Если ЗначениеЗаполнено(ВидДокумента) Тогда
ИдентификаторИПредставлениеВидаДокумента.Вставить("IdDoc", СокрЛП(ВидДокумента.Код));
ИдентификаторИПредставлениеВидаДокумента.Вставить("DocName", ВидДокумента.Наименование);
КонецЕсли;
Возврат ИдентификаторИПредставлениеВидаДокумента;
КонецФункции
Функция ИдентификаторИПредставлениеТипаПлатежа(Документ)
ИдентификаторИПредставлениеТипаПлатежа = Новый Структура("IdPayment, PaymentType");
ЗаявкаНаРасходованиеДенежныхСредств = Документ.ЗаявкаНаРасходованиеДенежныхСредств;
Если ЗначениеЗаполнено(ЗаявкаНаРасходованиеДенежныхСредств) Тогда
ИдентификаторИПредставлениеТипаПлатежа.Вставить("IdPayment",
СокрЛП(ЗаявкаНаРасходованиеДенежныхСредств.ТипПлатежаФЗ275.Код));
ИдентификаторИПредставлениеТипаПлатежа.Вставить("PaymentType",
ЗаявкаНаРасходованиеДенежныхСредств.ТипПлатежаФЗ275.Наименование);
КонецЕсли;
Возврат ИдентификаторИПредставлениеТипаПлатежа;
КонецФункции
Функция ДокументыКВыгрузкеПоБанку(СоответствиеБанковИСчетов, Банк)
ДокументыКВыгрузкеПоБанку = Новый Массив;
СчетаБанка = СоответствиеБанковИСчетов[Банк];
Для Каждого СчетБанка Из СчетаБанка Цикл
ДокументыКВыгрузкеПоСчету = ДокументыКВыгрузкеПоСчету(СчетБанка);
Для Каждого ДокументКВыгрузкеПоСчету Из ДокументыКВыгрузкеПоСчету Цикл
ДокументыКВыгрузкеПоБанку.Добавить(ДокументКВыгрузкеПоСчету);
КонецЦикла;
КонецЦикла;
Возврат ДокументыКВыгрузкеПоБанку;
КонецФункции
Функция МанифестПоУмолчанию()
СвойстваКорневогоЭлемента = Новый Структура("DateTimeFile_Attribute, Author_Attribute, Doc");
СвойстваКорневогоЭлемента.Вставить("DateTimeFile_Attribute", XMLСтрока(ТекущаяДатаСеанса()));
СвойстваКорневогоЭлемента.Вставить("Author_Attribute",
Метаданные.Синоним + ", " + НСтр("ru= 'версия'") + " " + Метаданные.Версия);
СвойстваКорневогоЭлемента.Вставить("Doc", Новый Массив);
Манифест = Новый Структура(КорневойЭлементМанифеста, СвойстваКорневогоЭлемента);
Возврат Манифест;
КонецФункции
Функция МанифестДокументаПоУмолчанию()
Манифест = Новый Структура("No, Date, Summ, Subfolder, IdPayment, PaymentType, IGK, embDoc");
Манифест.Вставить("No", 1);
Манифест.Вставить("Date", XMLДата(Дата(1,1,1)));
Манифест.Вставить("embDoc", Новый Массив);
Возврат Манифест;
КонецФункции
Функция МанифестПодтверждающегоДокументаПоУмолчанию()
Манифест = Новый Структура("DocId, No, Date, IdDoc, DocName, FileName");
Манифест.Вставить("FileName", Новый Структура);
Возврат Манифест;
КонецФункции
Функция МанифестФайлаПоУмолчанию()
Манифест = Новый Структура("FileName_Attribute, TypeFile_Attribute, SizeFile_Attribute");
Возврат Манифест;
КонецФункции
Процедура ПроверитьСоздатьКаталог(Путь)
Каталог = Новый Файл(Путь);
Если Не Каталог.Существует() Тогда
СоздатьКаталог(Путь);
КонецЕсли;
КонецПроцедуры
Функция РазделительКаталогов(Каталог)
Возврат ?(СтрЗаканчиваетсяНа(Каталог, "\"), "", "\");
КонецФункции
Функция СвойстваФайла(Файл, ИспользуемыеИменаФайлов)
СвойстваФайла = МанифестФайлаПоУмолчанию();
ИмяФайла = СокрЛП(Файл.Наименование) + "." + Файл.Расширение;
КоличествоПовторенийИмени = ИспользуемыеИменаФайлов[ИмяФайла];
Если КоличествоПовторенийИмени <> Неопределено Тогда
КоличествоПовторенийИмени = КоличествоПовторенийИмени + 1;
ИспользуемыеИменаФайлов.Вставить(ИмяФайла, КоличествоПовторенийИмени);
ИмяФайла = СокрЛП(Файл.Наименование) + " (" + КоличествоПовторенийИмени + ")" + "." + Файл.Расширение;
Иначе
ИспользуемыеИменаФайлов.Вставить(ИмяФайла, 1);
КонецЕсли;
СвойстваФайла.Вставить("FileName_Attribute", ИмяФайла);
СвойстваФайла.Вставить("TypeFile_Attribute", Файл.Расширение);
СвойстваФайла.Вставить("SizeFile_Attribute", Файл.Размер);
Возврат СвойстваФайла;
КонецФункции
Функция XMLДата(Дата)
Возврат Строка(Формат(Год(Дата),"ЧЦ=4; ЧВН=; ЧГ=0")) + "-"
+ Строка(Формат(Месяц(Дата), "ЧЦ=2; ЧВН=")) + "-"
+ Строка(Формат(День(Дата), "ЧЦ=2; ЧВН="));
КонецФункции
Функция ИнициализацияТаблицыРазмеров()
ТаблицаРазмеров = Новый ТаблицаЗначений;
ТаблицаРазмеров.Колонки.Добавить("Subfolder");
ТаблицаРазмеров.Колонки.Добавить("DocId");
ТаблицаРазмеров.Колонки.Добавить("СсылкаНаФайл");
ТаблицаРазмеров.Колонки.Добавить("ПолноеИмяФайла");
ТаблицаРазмеров.Колонки.Добавить("РазмерВБайтах");
Возврат ТаблицаРазмеров;
КонецФункции
Функция ИмяПеременнойПоИдентификатору(Идентификатор)
ИмяПеременнойПоИдентификатору = Строка(Идентификатор);
ИмяПеременнойПоИдентификатору = "_" + СтрЗаменить(ИмяПеременнойПоИдентификатору, "-", "_");
Возврат ИмяПеременнойПоИдентификатору;
КонецФункции
Функция ИдентификаторПоИмениПеременной(ИмяПеременной)
ИдентификаторПоИмениПеременной = Прав(ИмяПеременной, СтрДлина(ИмяПеременной)-1);
ИдентификаторПоИмениПеременной = СтрЗаменить(ИдентификаторПоИмениПеременной, "_", "-");
Возврат ИдентификаторПоИмениПеременной;
КонецФункции
#КонецОбласти
#Область ВыгрузкаПорциямиПоПравиламОбъединения
Функция ИнформацияОбОбъединенииФайлов(ВыгружаемыеБанковскиеСчета)
НовыйПоток = Новый Структура("Правило, Счета");
КоличествоСчетовВПравиле = Новый Соответствие;
ПотокиВыгрузки = Новый Массив;
СчетаБезПравил = Новый Массив;
ИнформацияОбОбъединенииФайлов = Новый Структура("
|ТекущееПравило,
|АдресТекущегоПотокаВыгрузки,
|ВсегоСчетовВТекущемПотоке,
|ВыгруженоСчетовВТекущийПоток,
|КоличествоСчетовВПравиле,
|СчетаБезПравил,
|ПотокиВыгрузки");
ИнформацияОбОбъединенииФайлов.Вставить("ТекущееПравило", "");
ИнформацияОбОбъединенииФайлов.Вставить("ВсегоСчетовВТекущемПотоке", 0);
ИнформацияОбОбъединенииФайлов.Вставить("ВсегоСчетовВТекущемПотоке", 0);
ИнформацияОбОбъединенииФайлов.Вставить("КоличествоСчетовВПравиле", КоличествоСчетовВПравиле);
ИнформацияОбОбъединенииФайлов.Вставить("СчетаБезПравил", СчетаБезПравил);
ИнформацияОбОбъединенииФайлов.Вставить("ПотокиВыгрузки", ПотокиВыгрузки);
Для Каждого Счет Из ВыгружаемыеБанковскиеСчета Цикл
Если ПустаяСтрока(Счет.ПравилоФайловогоОбменаСБанками) Тогда
СчетаБезПравил.Добавить(Счет);
Иначе
Количество = КоличествоСчетовВПравиле.Получить(Счет.ПравилоФайловогоОбменаСБанками);
Если Количество = Неопределено Тогда
ИнформацияОбОбъединенииФайлов["КоличествоСчетовВПравиле"].Вставить(
Счет.ПравилоФайловогоОбменаСБанками, 1);
Иначе
ИнформацияОбОбъединенииФайлов["КоличествоСчетовВПравиле"].Вставить(
Счет.ПравилоФайловогоОбменаСБанками, Количество + 1);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Для Каждого Правило Из КоличествоСчетовВПравиле Цикл
ПравилоПотока = Правило.Ключ;
ТекущийПоток = ОбщегоНазначенияКлиентСервер.СкопироватьСтруктуру(НовыйПоток);
ТекущийПоток.Вставить("Правило", Правило.Ключ);
ТекущийПоток.Вставить("Счета", ВыгружаемыеБанковскиеСчета.Скопировать(
ВыгружаемыеБанковскиеСчета.НайтиСтроки(Новый Структура("ПравилоФайловогоОбменаСБанками", Правило.Ключ))));
ИнформацияОбОбъединенииФайлов["ПотокиВыгрузки"].Добавить(ТекущийПоток);
КонецЦикла;
Возврат ИнформацияОбОбъединенииФайлов;
КонецФункции
Процедура ИзменитьРеквизитыСчетовПотока(Счета, ИзменяемыеПараметры)
Для Каждого Счет Из Счета Цикл
ЗаполнитьЗначенияСвойств(Счет, ИзменяемыеПараметры);
КонецЦикла;
КонецПроцедуры
Процедура ОбновитьИнформациюОВыгруженныхФайлах(Знач ИнформацияОбОбъединенииФайлов)
Для Каждого ПотокВыгрузки Из ИнформацияОбОбъединенииФайлов.ПотокиВыгрузки Цикл
Для Каждого ВыгруженныйСчет Из ПотокВыгрузки.Счета Цикл
Отбор = Новый Структура("Ссылка", ВыгруженныйСчет["Ссылка"]);
НайденныеСтроки = БанковскиеСчета.НайтиСтроки(Отбор);
Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
ЗаполнитьЗначенияСвойств(НайденнаяСтрока, ВыгруженныйСчет);
КонецЦикла;
КонецЦикла;
КонецЦикла;
Для Каждого ВыгруженныйСчет Из ИнформацияОбОбъединенииФайлов.СчетаБезПравил Цикл
Отбор = Новый Структура("Ссылка", ВыгруженныйСчет["Ссылка"]);
НайденныеСтроки = БанковскиеСчета.НайтиСтроки(Отбор);
Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
ЗаполнитьЗначенияСвойств(НайденнаяСтрока, ВыгруженныйСчет);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
Процедура ДополнитьТаблицуСчетовПоддержкойПрямогоОбмена(ТаблицаСчетов)
Для каждого Счет Из ТаблицаСчетов Цикл
Если ОбменСБанками.ВозможенПрямойОбменСБанком(Счет.БИКБанка, Неопределено) Тогда
Счет.ЕстьВозможностьПрямогоОбмена = Истина;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьДокументыКВыгрузке()
Проверки = Новый Соответствие;
Проверки.Вставить("Номер", НСтр("ru='Номер документа'"));
Проверки.Вставить("Дата", НСтр("ru='Дата документа'"));
Проверки.Вставить("Сумма", НСтр("ru='Сумма документа'"));
ПроверкиОрганизацииПР = Новый Соответствие;
ПроверкиОрганизацииПР.Вставить("ОрганизацияРасчСчет", НСтр("ru='Банковский счет организации'"));
ПроверкиОрганизацииПР.Вставить("ОрганизацияНаим", НСтр("ru='Наименование организации'"));
ПроверкиОрганизацииПР.Вставить("ОрганизацияИНН", НСтр("ru='ИНН организации'"));
ПроверкиОрганизацииНПР = Новый Соответствие;
ПроверкиОрганизацииНПР.Вставить("ОрганизацияРасчСчет", НСтр("ru='Банковский счет организации'"));
ПроверкиОрганизацииНПР.Вставить("ОрганизацияБанкДляРасчетов", НСтр("ru='Банк для расчетов организации'"));
ПроверкиОрганизацииНПР.Вставить("ОрганизацияГородБанка", НСтр("ru='Город банка организации'"));
ПроверкиОрганизацииНПР.Вставить("ОрганизацияБИКРЦБанка", НСтр("ru='БИК РЦ банка организации'"));
ПроверкиКонтрагентаПР = Новый Соответствие;
ПроверкиКонтрагентаПР.Вставить("КонтрагентРасчСчет", НСтр("ru='Банковский счет контрагента'"));
ПроверкиКонтрагентаПР.Вставить("КонтрагентНаим", НСтр("ru='Контрагент'"));
ПроверкиКонтрагентаПР.Вставить("КонтрагентИНН", НСтр("ru='ИНН контрагента'"));
ПроверкиКонтрагентаНПР = Новый Соответствие;
ПроверкиКонтрагентаНПР.Вставить("КонтрагентРасчСчет", НСтр("ru='Банковский счет контрагента'"));
ПроверкиКонтрагентаНПР.Вставить("КонтрагентБанкДляРасчетов", НСтр("ru='Банк для расчетов контрагента'"));
ПроверкиКонтрагентаНПР.Вставить("КонтрагентГородБанка", НСтр("ru='Город банка контрагента'"));
ПроверкиКонтрагентаНПР.Вставить("КонтрагентБИКРЦБанка", НСтр("ru='БИК РЦ банка контрагента'"));
ПроверкаISO = Новый Соответствие;
ПроверкаISO.Вставить("ОрганизацияСВИФТБанка", НСтр("ru = 'Идентификатор банка организации'"));
ПроверкаISO.Вставить("ОрганизацияБИКБанка", НСтр("ru = 'Идентификатор банка организации'"));
ПроверкаISO.Вставить("КонтрагентСВИФТБанка", НСтр("ru = 'Идентификатор банка получателя'"));
ПроверкаISO.Вставить("КонтрагентБИКБанка", НСтр("ru = 'Идентификатор банка получателя'"));
Для каждого ДокументКВыгрузке Из ДокументыКВыгрузке Цикл
СтрокаОшибки = "";
Счет = БанковскиеСчета.Найти(ДокументКВыгрузке.БанковскийСчет, "Ссылка");
Если Счет.ФорматОбмена = ПредопределенноеЗначение("Перечисление.ФорматОбменаСБанком.ClientBankExchange1c") Тогда
Для каждого Проверка Из Проверки Цикл
Если Не ЗначениеЗаполнено(ДокументКВыгрузке[Проверка.Ключ]) Тогда
СтрокаОшибки = СтрокаОшибки + " " + Проверка.Значение + ",";
КонецЕсли;
КонецЦикла;
Если Не ЗначениеЗаполнено(ДокументКВыгрузке.ОрганизацияБанкДляРасчетов) Тогда
ПроверкаСчетаОрганизации = ПроверкиОрганизацииПР;
Иначе
ПроверкаСчетаОрганизации = ПроверкиОрганизацииНПР;
КонецЕсли;
Для каждого Проверка Из ПроверкаСчетаОрганизации Цикл
Если Не ЗначениеЗаполнено(ДокументКВыгрузке[Проверка.Ключ]) Тогда
СтрокаОшибки = СтрокаОшибки + " " + Проверка.Значение + ",";
КонецЕсли;
КонецЦикла;
Если Не ЗначениеЗаполнено(ДокументКВыгрузке.КонтрагентБанкДляРасчетов) Тогда
ПроверкаСчетаКонтрагента = ПроверкиКонтрагентаПР;
Иначе
ПроверкаСчетаКонтрагента = ПроверкиКонтрагентаНПР;
КонецЕсли;
Для каждого Проверка Из ПроверкаСчетаКонтрагента Цикл
Если ДокументКВыгрузке.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицоНеРезидент
И Проверка.Ключ = "КонтрагентИНН" Тогда
Продолжить;
КонецЕсли;
Если Не ЗначениеЗаполнено(ДокументКВыгрузке[Проверка.Ключ]) Тогда
СтрокаОшибки = СтрокаОшибки + " " + Проверка.Значение + ",";
КонецЕсли;
КонецЦикла;
ИначеЕсли Счет.ФорматОбмена = ПредопределенноеЗначение("Перечисление.ФорматОбменаСБанком.ISO20022") Тогда
Если Не ЗначениеЗаполнено(ДокументКВыгрузке.ОрганизацияСВИФТБанка)
И Не ЗначениеЗаполнено(ДокументКВыгрузке.ОрганизацияБИКБанка) Тогда
Текст = НСтр("ru='Идентификатор банка организации (БИК / SWIFT)'");
СтрокаОшибки = СтрокаОшибки + " " + Текст + ",";
КонецЕсли;
Если Не ЗначениеЗаполнено(ДокументКВыгрузке.КонтрагентСВИФТБанка)
И Не ЗначениеЗаполнено(ДокументКВыгрузке.КонтрагентБИКБанка) Тогда
Текст = НСтр("ru='Идентификатор банка получателя (БИК / SWIFT)'");
СтрокаОшибки = СтрокаОшибки + " " + Текст + ",";
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(СтрокаОшибки) Тогда
СтрокаОшибки = Лев(СтрокаОшибки, СтрДлина(СтрокаОшибки) - 1);
ДокументКВыгрузке.ЕстьОшибка = Истина;
ДокументКВыгрузке.Выгружать = Ложь;
ДокументКВыгрузке.ОписаниеОшибок = НСтр("ru='Не заполнены реквизиты платежа:'") + СтрокаОшибки;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ДокументыКВыгрузкеПоСчетам(Счета)
ДокументыКВыгрузкеПоСчетам = Новый Массив;
Для Каждого Счет Из Счета Цикл
Отбор = Новый Структура;
Отбор.Вставить("Выгружать", Истина);
Отбор.Вставить("БанковскийСчет", Счет["Ссылка"]);
НайденныеДокументы = ДокументыКВыгрузке.НайтиСтроки(Отбор);
Для Каждого НайденныйДокумент Из НайденныеДокументы Цикл
ДокументыКВыгрузкеПоСчетам.Добавить(НайденныйДокумент);
КонецЦикла;
КонецЦикла;
Возврат ДокументыКВыгрузкеПоСчетам;
КонецФункции
Функция ДокументыКВыгрузкеПоСчету(Счет)
Отбор = Новый Структура;
Отбор.Вставить("Выгружать", Истина);
Отбор.Вставить("БанковскийСчет", Счет["Ссылка"]);
Возврат ДокументыКВыгрузке.НайтиСтроки(Отбор);
КонецФункции
Процедура ВывестиСекциюОтчетаОВыгрузке(ПолеОтчета, Документы, БанковскийСчет, Выгружен)
МакетОтчета = ПолучитьМакет("ОтчетОВыгрузке");
Шапка = МакетОтчета.ПолучитьОбласть("Шапка");
Строка = МакетОтчета.ПолучитьОбласть("Строка");
Подвал = МакетОтчета.ПолучитьОбласть("Подвал");
НазвОрг = МакетОтчета.ПолучитьОбласть("НазваниеОрганизации");
РеквизитыСчета = Справочники.БанковскиеСчетаОрганизаций.ПолучитьРеквизитыБанковскогоСчетаОрганизации(БанковскийСчет);
НазвОрг.Параметры.НазваниеОрганизации = Строка(РеквизитыСчета.Организация);
ПолеОтчета.Вывести(НазвОрг);
Если Выгружен Тогда
Шапка.Параметры.ИмяОтчета = НСтр("ru='Отчет о выгруженных документах'");
Иначе
Шапка.Параметры.ИмяОтчета = НСтр("ru='Документы к выгрузке'");
КонецЕсли;
Шапка.Параметры.ИмяСуммыПоступления = НСтр("ru = 'Поступление'");
Шапка.Параметры.ИмяСуммыСписания = НСтр("ru = 'Списание'");
ОбрБанковскийСчет = "";
Инд = 0; ИтогоСуммаП = 0; ИтогоСуммаР = 0;
Документы.Сортировать("Дата");
НачПериода = Документы[0].Дата;
КонПериода = Документы[Документы.Количество() - 1].Дата;
Валюта = ?(ЗначениеЗаполнено(РеквизитыСчета.Валюта), СокрЛП(Строка(РеквизитыСчета.Валюта)), НСтр("ru='валюта не указана'"));
НачалоОтчетногоПериода = Формат(НачПериода, "ДЛФ=D");
КонецОтчетногоПериода = Формат(КонПериода, "ДЛФ=D");
Шапка.Параметры.ОписаниеПериода =
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='по счету %1 (%2) с %3 по %4'"),
РеквизитыСчета.НомерСчета,
Валюта,
НачалоОтчетногоПериода,
КонецОтчетногоПериода);
ПолеОтчета.Вывести(Шапка);
Для Каждого СтрокаИсточника Из Документы Цикл
Валюта = ?(ЗначениеЗаполнено(СтрокаИсточника.Валюта), СокрЛП(Строка(СтрокаИсточника.Валюта)), НСтр("ru='валюта не указана'"));
Если СтрокаИсточника.ВидДокумента = Перечисления.ТипыПлатежныхДокументов.ПлатежноеТребование Тогда
Строка.Параметры.Получатель = СтрокаИсточника.ОрганизацияНаим;
Строка.Параметры.ПолучательСчет = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1 (%2)'"),
СтрокаИсточника.ОрганизацияРасчСчет,
Валюта);
Строка.Параметры.Плательщик = СтрокаИсточника.Контрагент;
Строка.Параметры.ПлательщикСчет = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1 (%2)'"),
СтрокаИсточника.КонтрагентРасчСчет,
Валюта);
Строка.Параметры.СуммаПоступление = СтрокаИсточника.Сумма;
Строка.Параметры.СуммаСписание = "";
ИтогоСуммаП = ИтогоСуммаП + СтрокаИсточника.Сумма;
Иначе
Строка.Параметры.Плательщик = СтрокаИсточника.ОрганизацияНаим;
Строка.Параметры.ПлательщикСчет = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1 (%2)'"),
СтрокаИсточника.ОрганизацияРасчСчет,
Валюта);
Строка.Параметры.Получатель = СтрокаИсточника.Контрагент;
Строка.Параметры.ПолучательСчет = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1 (%2)'"),
СтрокаИсточника.КонтрагентРасчСчет,
Валюта);
Строка.Параметры.СуммаПоступление = "";
Строка.Параметры.СуммаСписание = СтрокаИсточника.Сумма;
ИтогоСуммаР = ИтогоСуммаР + СтрокаИсточника.Сумма;
КонецЕсли;
Строка.Параметры.Документ = СтрокаИсточника["Ссылка"];
Инд = Инд + 1;
Строка.Параметры["Индекс"] = Инд;
ПолеОтчета.Вывести(Строка);
КонецЦикла;
Подвал.Параметры.ИтогоСуммаП = ИтогоСуммаП;
Подвал.Параметры.ИтогоСуммаР = ИтогоСуммаР;
ПолеОтчета.Вывести(Подвал);
ПолеОтчета.ОтображатьГруппировки = Ложь;
ПолеОтчета.ОтображатьЗаголовки = Ложь;
ПолеОтчета.ОтображатьСетку = Ложь;
ПолеОтчета.ТолькоПросмотр = Истина;
КонецПроцедуры
Процедура ВывестиСекциюОтчетаОЗагрузке(ПолеОтчета, Документы, БанковскийСчет, Загружен)
МакетОтчета = ПолучитьМакет("ОтчетОЗагрузке");
ИмеетсяСекцияРасчСчет = Ложь;
Шапка = МакетОтчета.ПолучитьОбласть("Шапка");
Строка = МакетОтчета.ПолучитьОбласть("Строка");
Подвал = МакетОтчета.ПолучитьОбласть("Подвал");
Остатки = МакетОтчета.ПолучитьОбласть("Остатки");
НазвОрг = МакетОтчета.ПолучитьОбласть("НазваниеОрганизации");
РеквизитыСчета = Справочники.БанковскиеСчетаОрганизаций.ПолучитьРеквизитыБанковскогоСчетаОрганизации(БанковскийСчет);
НазвОрг.Параметры.НазваниеОрганизации = Строка(РеквизитыСчета.Организация);
ПолеОтчета.Вывести(НазвОрг);
Если Загружен Тогда
Шапка.Параметры.ИмяОтчета = НСтр("ru='Отчет о загруженных документах'");
Иначе
Шапка.Параметры.ИмяОтчета = НСтр("ru='Документы выписки'");
КонецЕсли;
ОбрБанковскийСчет = "";
Инд = 0; ИтогоСуммаП = 0; ИтогоСуммаР = 0;
Документы.Сортировать("Дата");
НачПериода = Документы[0].ДатаДок;
КонПериода = Документы[Документы.Количество() - 1].ДатаДок;
Валюта = ?(ЗначениеЗаполнено(РеквизитыСчета.Валюта), СокрЛП(Строка(РеквизитыСчета.Валюта)), НСтр("ru='валюта не указана'"));
НачалоОтчетногоПериода = Формат(НачПериода, "ДЛФ=D");
КонецОтчетногоПериода = Формат(КонПериода, "ДЛФ=D");
ДеталиКазначейскогоСчета = Новый Массив;
Если ЗначениеЗаполнено(РеквизитыСчета.НомерЛицевогоСчета) Тогда
ДеталиКазначейскогоСчета.Добавить(РеквизитыСчета.НомерЛицевогоСчета);
КонецЕсли;
Если ЗначениеЗаполнено(РеквизитыСчета.РазделЛицевогоСчета) Тогда
ДеталиКазначейскогоСчета.Добавить(РеквизитыСчета.РазделЛицевогоСчета);
КонецЕсли;
ТекстЛицевогоСчетаРаздела = СтрСоединить(ДеталиКазначейскогоСчета, "/");
Шапка.Параметры.ОписаниеПериода = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='по счету %1%2 (%3) с %4 по %5'"),
СокрЛП(РеквизитыСчета.НомерСчета),
?(ПустаяСтрока(ТекстЛицевогоСчетаРаздела), "", "/" + ТекстЛицевогоСчетаРаздела),
Валюта,
НачалоОтчетногоПериода,
КонецОтчетногоПериода);
ПолеОтчета.Вывести(Шапка);
Для Каждого СтрокаИсточника Из Документы Цикл
Валюта = ?(ЗначениеЗаполнено(СтрокаИсточника.Валюта), СокрЛП(Строка(СтрокаИсточника.Валюта)), НСтр("ru='валюта не указана'"));
Если СтрокаИсточника.СуммаПоступило > 0 Тогда
Строка.Параметры.Контрагент =
?(ПустаяСтрока(СтрокаИсточника.Плательщик1), СтрокаИсточника.Плательщик, СтрокаИсточника.Плательщик1);
Строка.Параметры.Счет = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1 (%2)'"),
СтрокаИсточника.ПлательщикСчет,
Валюта);
Строка.Параметры.СуммаПоступление = СтрокаИсточника.СуммаПоступило;
Строка.Параметры.СуммаСписание = "";
Строка.Параметры.Дата = Формат(СтрокаИсточника.ДатаДок, "ДЛФ=Д");
ИтогоСуммаП = ИтогоСуммаП + СтрокаИсточника.СуммаПоступило;
ИначеЕсли СтрокаИсточника.СуммаСписано > 0 Тогда
Строка.Параметры.Контрагент =
?(ПустаяСтрока(СтрокаИсточника.Получатель1), СтрокаИсточника.Получатель, СтрокаИсточника.Получатель1);
Строка.Параметры.Счет = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1 (%2)'"),
СтрокаИсточника.ПолучательСчет,
Валюта);
Строка.Параметры.СуммаСписание = СтрокаИсточника.СуммаСписано;
Строка.Параметры.СуммаПоступление = "";
Строка.Параметры.Дата =
?(ПустаяСтрока(СтрокаИсточника.Дата), Формат(СтрокаИсточника.ДатаДок, "ДЛФ=Д"), СтрокаИсточника.Дата);
ИтогоСуммаР = ИтогоСуммаР + СтрокаИсточника.СуммаСписано;
Иначе
Продолжить;
КонецЕсли;
Если Загружен Тогда
Док = СтрокаИсточника.Документ;
Если ЗначениеЗаполнено(Док) Тогда
Строка.Параметры.Документ = Док;
ОбластьСтрока = Строка.Области["Строка"];
ОбластьСтрока.ЦветТекста = ЦветаСтиля.ЦветТекстаФормы;
Иначе
Строка.Параметры.Документ = НСтр("ru='НЕ ЗАГРУЖЕН'");
Если ЗначениеЗаполнено(СтрокаИсточника.ОшибкиЗагрузки) Тогда
Строка.Параметры.Документ = Строка.Параметры.Документ + ": " + СтрокаИсточника.ОшибкиЗагрузки;
КонецЕсли;
ОбластьСтрока = Строка.Области["Строка"];
ОбластьСтрока.ЦветТекста = ЦветаСтиля.ЦветОтрицательногоЧисла;
КонецЕсли;
КонецЕсли;
Строка.Параметры.Номер = СтрокаИсточника.Номер;
Строка.Параметры.НазначениеПлатежа = СтрокаИсточника.НазначениеПлатежа;
Инд = Инд + 1;
Строка.Параметры["Индекс"] = Инд;
ПолеОтчета.Вывести(Строка);
КонецЦикла;
Подвал.Параметры.ИтогоСуммаП = ИтогоСуммаП;
Подвал.Параметры.ИтогоСуммаР = ИтогоСуммаР;
ПолеОтчета.Вывести(Подвал);
ПолеОтчета.ОтображатьГруппировки = Ложь;
ПолеОтчета.ОтображатьЗаголовки = Ложь;
ПолеОтчета.ОтображатьСетку = Ложь;
ПолеОтчета.ТолькоПросмотр = Истина;
КонецПроцедуры
Процедура ЗаполнитьИнформациюОПолучателяхПлательщиках(ТаблицаПлатежей)
МассивДокументов = ТаблицаПлатежей.ВыгрузитьКолонку("Ссылка");
ДанныеКонтрагентов = ДенежныеСредстваСервер.СведенияОПолучателеПлательщикеПоДокументам(МассивДокументов);
Для Каждого СтрокаТаблицы Из ТаблицаПлатежей Цикл
Если ТипЗнч(СтрокаТаблицы.БанковскийСчетКонтрагента) = Тип("СправочникСсылка.БанковскиеСчетаОрганизаций") Тогда
Если СтрокаТаблицы.Операция = Перечисления.ХозяйственныеОперации.КонвертацияВалюты Тогда
Обработки.КлиентБанк.ЗаполнитьЗначениеРеквизитаПоДокументу(
ДанныеКонтрагентов,
СтрокаТаблицы.КонтрагентНаим,
СтрокаТаблицы.Ссылка,
4);
Иначе
Обработки.КлиентБанк.ЗаполнитьЗначениеРеквизитаПоДокументу(
ДанныеКонтрагентов,
СтрокаТаблицы.КонтрагентНаим,
СтрокаТаблицы.Ссылка,
2);
КонецЕсли;
Иначе
Обработки.КлиентБанк.ЗаполнитьЗначениеРеквизитаПоДокументу(
ДанныеКонтрагентов,
СтрокаТаблицы.КонтрагентНаим,
СтрокаТаблицы.Ссылка,
0);
КонецЕсли;
Если СтрокаТаблицы.Операция = Перечисления.ХозяйственныеОперации.КонвертацияВалюты Тогда
Обработки.КлиентБанк.ЗаполнитьЗначениеРеквизитаПоДокументу(
ДанныеКонтрагентов,
СтрокаТаблицы.КонтрагентНаименованиеМеждународное,
СтрокаТаблицы.Ссылка,
6);
Обработки.КлиентБанк.ЗаполнитьЗначениеРеквизитаПоДокументу(
ДанныеКонтрагентов,
СтрокаТаблицы.КПППолучателя,
СтрокаТаблицы.Ссылка,
7);
Иначе
Обработки.КлиентБанк.ЗаполнитьЗначениеРеквизитаПоДокументу(
ДанныеКонтрагентов,
СтрокаТаблицы.КонтрагентНаименованиеМеждународное,
СтрокаТаблицы.Ссылка,
3);
Обработки.КлиентБанк.ЗаполнитьЗначениеРеквизитаПоДокументу(
ДанныеКонтрагентов,
СтрокаТаблицы.КПППолучателя,
СтрокаТаблицы.Ссылка,
1);
КонецЕсли;
Обработки.КлиентБанк.ЗаполнитьЗначениеРеквизитаПоДокументу(
ДанныеКонтрагентов,
СтрокаТаблицы.ОрганизацияНаим,
СтрокаТаблицы.Ссылка,
4);
Обработки.КлиентБанк.ЗаполнитьЗначениеРеквизитаПоДокументу(
ДанныеКонтрагентов,
СтрокаТаблицы.ОрганизацияНаименованиеМеждународное,
СтрокаТаблицы.Ссылка,
6);
Обработки.КлиентБанк.ЗаполнитьЗначениеРеквизитаПоДокументу(
ДанныеКонтрагентов,
СтрокаТаблицы.КПППлательщика,
СтрокаТаблицы.Ссылка,
7);
КонецЦикла;
КонецПроцедуры
КорневойЭлементМанифеста = "PaymentData";
ИмяФайлаМанифеста = "ExportData.xml";
ПоддержкаПлатежейВСоответствииС275ФЗ = ПолучитьФункциональнуюОпцию("ПоддержкаБанковскогоИКазначейскогоСопровожденияГосконтрактов");
УстановитьПривилегированныйРежим(Истина);
КаталогВыгрузкиПодтверждающихДокументов = Константы.КаталогВыгрузкиПодтверждающихДокументов.Получить();
УстановитьПривилегированныйРежим(Ложь);
#КонецОбласти
#КонецЕсли