Возникла ситуация при которой необходимо было загрузить и обработать выписка банка Аваль. Задача была немного специфичная, но за нее платят - значит делаем.
С первым с чем столкнулся - это выгрузка, получил ее в формате 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";
НоваяСтрока.Представление = "Создание кассовых поступлений";
НоваяСтрока.ПоказыватьОповещение = Истина;
НоваяСтрока.Использование = "ОткрытиеФормы";
Структура.Вставить("Команды", Команды);
Возврат Структура;
КонецФункции
вот в принципе и все, успехов в работе.