Dev_nab
@Dev_nab

Django — Как загрузить данные с банковской выписки 1С в MySQL?

Пример взял отсюда
https://habr.com/post/245397/

Банковская выписка(txt), которую нужно обработать.
spoiler
1CClientBankExchange
ВерсияФормата=1.02
Кодировка=Windows
Отправитель=Cистема Солнышко Интернет-Банк
Получатель=Бухгалтерский учет, редакция 4.4
ДатаНачала=27.11.2013
ДатаКонца=27.11.2014
РасчСчет=12345678901234567890
СекцияРасчСчет
ДатаНачала=27.11.2013
ДатаКонца=27.11.2014
РасчСчет=12345678901234567890
НачальныйОстаток=0
ВсегоПоступило=68770
ВсегоСписано=68770
КонечныйОстаток=0
КонецРасчСчет
СекцияДокумент=Банковский ордер
Номер=1
Дата=26.12.2013
Сумма=1000
ДатаСписано=26.12.2013
ДатаПоступило=
ПлательщикСчет=12345678901234567890
Плательщик=ИНН 778899001122 Иванов Иван Иванович (ИП)
ПлательщикИНН= 778899001122
Плательщик1=Иванов Иван Иванович (ИП)
ПлательщикРасчСчет=12345678901234567890
ПлательщикБанк1=ОАО АКБ "Солнышко"
ПлательщикБанк2=г. МОСКВА
ПлательщикБИК=044525201
ПлательщикКорсчет=98765432198765432100
ПлательщикКорсчет=98765432198765432100
ПолучательСчет=89765456787654345678
Получатель=ИНН 7765434566\775001001 ОАО АКБ "Солнышко"
ПолучательИНН=7765434566
Получатель1=ОАО АКБ "Солнышко"
ПолучательРасчСчет=89765456787654345678
ПолучательБанк1=ОАО АКБ "Солнышко"
ПолучательБанк2=г. МОСКВА
ПолучательБИК=044525201
ПолучательКорсчет=98765432198765432100
ВидОплаты=17
НазначениеПлатежа=Комиссия за открытие счета согласно тарифам ОАО АКБ "Солнышко"
КонецДокумента
СекцияДокумент=Платежное поручение
Номер=176
Дата=26.12.2013
Сумма=4770
ДатаСписано=
Плательщик=ИНН 7725747515\772501001 ООО "ВИОСН"
ПлательщикИНН=7725747515
ПлательщикСчет=40702810822000034869
Плательщик1=ООО "ВИОСН"
ПлательщикРасчСчет=40702810822000034869
ПлательщикБанк1=АКБ "АБСОЛЮТ БАНК" (ОАО)
ПлательщикБанк2=г. МОСКВА
ПлательщикБИК=044525976
ПлательщикКорсчет=30101810500000000976
ДатаПоступило=26.12.2013
Получатель=ИНН 778899001122 ИП Иванов Иван Иванович
ПолучательИНН=778899001122
ПолучательСчет=12345678901234567890
Получатель1=ИП Иванов Иван Иванович
ПолучательРасчСчет=12345678901234567890
ПолучательБанк1=ОАО АКБ "Солнышко"
ПолучательБанк2=г. МОСКВА
ПолучательБИК=044525201
ПолучательКорсчет=98765432198765432100
ВидОплаты=01
СрокПлатежа=26.12.2013
Очередность=5
НазначениеПлатежа=Оплата по счету №1 от 26 декабря (за услуги по обслуживанию сайта ) НДС не облагается.
КонецДокумента
СекцияДокумент=Банковский ордер
Номер=1
Дата=10.01.2014
Сумма=20
ДатаСписано=10.01.2014
ДатаПоступило=
ПлательщикСчет=12345678901234567890
Плательщик=ИНН 778899001122 Иванов Иван Иванович (ИП)
ПлательщикИНН=778899001122
Плательщик1=Иванов Иван Иванович (ИП)
ПлательщикРасчСчет=12345678901234567890
ПлательщикБанк1=ОАО АКБ "Солнышко"
ПлательщикБанк2=г. МОСКВА
ПлательщикБИК=044525201
ПлательщикКорсчет=98765432198765432100
ПолучательСчет=70601810200021210220
Получатель=ИНН 7765434566\775001001 ОАО АКБ "Солнышко"
ПолучательИНН=7765434566
Получатель1=ОАО АКБ "Солнышко"
ПолучательРасчСчет=70601810200021210220
ПолучательБанк1=ОАО АКБ "Солнышко"
ПолучательБанк2=г. МОСКВА
ПолучательБИК=044525201
ПолучательКорсчет=98765432198765432100
ВидОплаты=17
НазначениеПлатежа=Плата за прием и обработку платежных документов
КонецДокумента
СекцияДокумент=Платежное поручение
Номер=1
Дата=10.01.2014
Сумма=3500
ДатаСписано=10.01.2014
Плательщик=ИНН 778899001122\772801001 Иванов Иван Иванович (ИП)
ПлательщикИНН=778899001122
ПлательщикСчет=12345678901234567890
Плательщик1=Иванов Иван Иванович (ИП)
ПлательщикРасчСчет=12345678901234567890
ПлательщикБанк1=ОАО АКБ "Солнышко"
ПлательщикБанк2=г. МОСКВА
ПлательщикБИК=044525201
ПлательщикКорсчет=98765432198765432100
ДатаПоступило=
Получатель=ИНН 7707704692\772801001 ОАО "Единая электронная торговая площадка"
ПолучательИНН=7707704692
ПолучательСчет=40702810000760001497
Получатель1=ОАО "Единая электронная торговая площадка"
ПолучательРасчСчет=40702810000760001497
ПолучательБанк1=ОАО "БАНК МОСКВЫ"
ПолучательБанк2=г. МОСКВА
ПолучательБИК=044525219
ПолучательКорсчет=30101810500000000219
ВидОплаты=01
СтатусСоставителя=01
ПлательщикКПП=772801001
ПолучательКПП=772801001
ПоказательКБК=00000000000000000000
ОКАТО=0
ПоказательОснования=0
ПоказательПериода=0
ПоказательНомера=0
ПоказательДаты=10.01.2014
ПоказательТипа=0
СрокПлатежа=10.01.2014
Очередность=5
НазначениеПлатежа=Сумма 3500.00, в т.ч. НДС - 388,99
КонецДокумента
КонецФайла


Код на Python
# Пустые списки (массивы)
a = [] # Тут будут строки файла
b = [] # Тут строки файла, разделенные знаком =, где b[i][0] = "Ключ", b[i][1] = "Значение"
main = [] # Основная информация
f = open("f.txt") # Открываю файл выписки f.txt
a = f.readlines() # Читаю файл построчно
l = [ line.rstrip() for line in a ] # Удаляю символ \n
for x in l:
    b.append(x.split("=")) # Разделаю строки по = символу и добавляю в список b
# Читаю основную инфу (до первой строки 'СекцияДокумент')
for i in range(len(b)):
    if b[i][0] == 'СекцияДокумент':
        break
    else:
        main.append(b[i]) # Добавляю основную инфу в список main

key = 0
doc = []
q = {key: []} # Завожу словарь для хранения документов
# Начинаю делить по документам
for k in range(len(main), len(b)):
    if b[k][0] == 'КонецДокумента': # 1 документ закончен
        q[key] = doc # Добавляю документ в словарь
        doc = [] # Очищаю список doc
        key += 1 # Ключ словаря увеличиваю +1 для след. документа
    elif b[k][0] == 'КонецФайла': # Если конец файла, то
       close(f) # Закрываем файл
       break  # Выходим
    else:
        doc.append(b[k][1])   # Пока документ не закончился, 
        # Добавляем строки (после знака =) в список doc


Дальше хотел создать в models.py поля и загрузить циклом из словаря данные в эти поля. Но фишка в чем, напр., грубо говоря, в документе (СекцияДокумент) 1 - строк 17, в документе 2 - 19, документе 3 - 23.

Соответственно , для 1 нужно 17 полей, для 2 - 19 и т.д. К тому же в документах некоторые строки повторяются, некоторые переставлены местами. Т.е. формат не фиксирован.

Как правильно реализовать?
  • Вопрос задан
  • 377 просмотров
Решения вопроса 1
1 -Выяснить сколько всего разных уникальных полей у нас получится чтоб на основе этих данных можно было создать таблицу в базе данных и не возникло ситуации что в выписке это поле есть, а в базе нет.
2 - При парсинге/выгрузке выписки устранить дублирующиеся поля, если брать приведенный пример выписки то ПлательщикКорсчет=98765432198765432100 дублируется и одну строку надо выкинуть
3 - Загрузить данные в базу, возможно останутся пустые поля, но если в выписках количество полей не одинаково то от этого никуда не деться.

Либо конвертировать все поля в XML или JSON строку и сохранять как есть.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@r0y
подскажите как выгрузить всё это в эксель )
и я возликую )
у меня в облаке от хостера стерильная система
питон нашёл )) но странно
я на асме и эрланге прогаю, а тут так просто, что непонятно )

workbook = xlsxwriter.Workbook('Expenses01.xlsx')
worksheet = workbook.add_worksheet()

# Some data we want to write to the worksheet.

# Start from the first cell. Rows and columns are zero indexed.
row = 0
col = 0

# Iterate over the data and write it out row by row.
for item, cost in (doc):
worksheet.write(row, col, item)
worksheet.write(row, col + 1, cost)
row += 1

# Write a total using a formula.
worksheet.write(row, 0, 'Total')
worksheet.write(row, 1, '=SUM(B1:B4)')
workbook.close()

не пойму как раскрутить обратно )
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы