Monday, July 13, 2015

Загрузка банковских выписок, на примере банка "Аваль"

Возникла ситуация при которой необходимо было загрузить и обработать выписка банка Аваль. Задача была немного специфичная, но за нее платят - значит делаем.
С первым с чем столкнулся - это выгрузка, получил ее в формате csv, в общем текстовый формат. Интересовала меня распарсивание одной строки

Дата транзакції,"Дата списання","Номер картки ","Тип транзакції","Деталі транзакції","Вхідний залишок","Сума у валюті рахунку","Сума в валюті транзакції","Валюта транзакції","Вихідний залишок"

Для упрощения гемороя в работе со строками, давно использую regex, чего и всем рекомендую. Также рекомендую для тестировани и настройки работы пользоваться сайтом, ну и большое THANKS ребятам которые его сделали.
В общем первое создаем внешнюю обработку, а в ней форму
В форме кроме реквизитов добавляем 2 команды "КомандаЗагрузить" и "СоздатьДокументы", после этого пишем следующий код:


&НаКлиенте
Процедура КомандаЗагрузить(Команда)
 Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
 Диалог.Заголовок = "Выбирете файлы для загрузки в 1С";
 Диалог.Фильтр = "CSV (*.csv)|*.csv|Все файлы|*.*";
 Диалог.МножественныйВыбор=Ложь;
 Диалог.ПроверятьСуществованиеФайла = Истина;
 Если Диалог.Выбрать() Тогда
      ВыбранногоФайла = Диалог.ВыбранныеФайлы[0];
   ТФайл = Новый Файл(ВыбранногоФайла);
   Если ТФайл.Существует() тогда    
    Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВыбранногоФайла));
    ЗагрузитьКассы(Адрес);
   Иначе
    Сообщение = Новый СообщениеПользователю();
       Сообщение.Текст = "Не удалось найти файл:"+ВыбранногоФайла;       
       Сообщение.Сообщить();
   КонецЕсли;  
 КонецЕсли;
КонецПроцедуры

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


Процедура ЗагрузитьКассы(Адрес)
 ВремФайл = ПолучитьИмяВременногоФайла("csv");
 ДанныеХранилища = ПолучитьИзВременногоХранилища(Адрес);
 ДанныеХранилища.Записать(ВремФайл);
 
 ЧФ = Новый ЧтениеТекста(ВремФайл);
 БуфферСтрок = ЧФ.Прочитать();
 ЧФ.Закрыть();
 
 ВремТБЛ = RegExpТаблицаЗначений(БуфферСтрок,"""(\d{2}.\d{2}.\d{4})"",""\d{2}.\d{2}.\d{4}"","".*"","".*"",""Готівкове поповнення.*"",""[\d\s\.]*"",""([\d\s\.]*)"",""[\d\s\.]*"",""UAH"",""[\d\s\.]*""");
 ТаблицаСумм.Очистить();
 Нумерация = 1;
 Для Каждого СтрокаВремТбл из ВремТБЛ Цикл
  НС = ТаблицаСумм.Добавить();
  НС.Номер = Нумерация;
  Нумерация = Нумерация+1;
  НС.Загружать = Истина;
  МассивДаты = МастерПроцедурыСервера.RegExpМассив(СтрокаВремТбл.К1,"(\d{2}).(\d{2}).(\d{4})");
  Если МассивДаты.Количество()=3 тогда
   НС.Дата = Дата(МассивДаты[2],МассивДаты[1],МассивДаты[0]);
  Иначе
   НС.Дата = НаДату;
  КонецЕсли;
  НС.Сумма = Число(СтрЗаменить(СтрокаВремТбл.К2," ",""));
  НС.Контрагент = Контргаент;
 КонецЦикла;
 Элементы.ТаблицаСумм.Подвал=Истина;
 Элементы.ТаблицаСуммСумма.ТекстПодвала = ТаблицаСумм.Итог("Сумма");
 //Элементы.ТаблицаСуммСумма.ПутьКДаннымПодвала
КонецПроцедуры

Функция RegExpТаблицаЗначений(Строка,Паттерн, MultiLine = Истина, Global = Истина, IgnoreCase = Истина) Экспорт //Возвращает первое вхождение
 RegExp = Новый COMОбъект("VBScript.RegExp");
 Тбл = Новый ТаблицаЗначений;
 КвоКолонок = СтрЧислоВхождений(Паттерн,"(");
 Для х=1 по КвоКолонок Цикл
  Тбл.Колонки.Добавить("К"+х);
 КонецЦикла;
 RegExp.MultiLine = MultiLine; // истина — текст многострочный, ложь — одна строка 
 RegExp.Global = Global; // истина — поиск по всей строке, ложь — до первого совпадения 
 RegExp.IgnoreCase = IgnoreCase; // истина — игнорировать регистр строки при поиске  
 RegExp.Pattern = Паттерн;
 Matches=RegExp.Execute(Строка);
 //возМассив = Новый Массив;
 Если RegExp.Test(Строка) тогда
  Для н=0 по Matches.Count-1 Цикл 
   НоваяСтрока = Тбл.Добавить();
   Для х=0 по Matches.Item(н).SubMatches.Count-1 Цикл
    //возМассив.Добавить(Matches.Item(н).SubMatches.Item(х));
    НоваяСтрока["К"+(х+1)]=Matches.Item(н).SubMatches.Item(х);
   КонецЦикла;
  КонецЦикла;
  Возврат Тбл
 КонецЕсли;
 Возврат Тбл;
КонецФункции

&НаКлиенте
Процедура ТаблицаСуммПослеУдаления(Элемент)
 УстановитьНомераСтрок();
КонецПроцедуры

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


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


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


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

   ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
   стрТаблицаСумм.Документ = ДокОбъект.Ссылка;
  КонецЕсли;
 КонецЦикла;
КонецПроцедуры


После этого не забываем, что данную обработку подключим внешней обработкой к УТ11 и добавляем в модуле следующие строки:

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



вот в принципе и все, успехов в работе.

No comments:

Post a Comment