С первым с чем столкнулся - это выгрузка, получил ее в формате 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