Имя: Пароль:
1C
 
Парсинг выписки
0 Deon
 
16.11.06
10:29
Господа, пришла тут выписка из банка.
Клиенты в комментариях к платежу пишут массу всяких интересных вещей и иногда даже нужный номер накладной или фактуры, к которой хотелось бы подвесить этот платеж.
Есть желание автоматизировать распознавание номера документа.
Есть ли у кого-нибудь готовые решения?
1 Чес
 
16.11.06
10:29
Их милльен. У любого франча весь набор на все банки
2 Ёпрст2
 
16.11.06
10:30
(0) текст строки дай ...
3 Deon
 
16.11.06
10:31
(1) При чем тут банк?
4 Deon
 
16.11.06
10:31
(2) вариантов много
5 Ёпрст2
 
16.11.06
10:31
(4) Телепатов мало ..
6 Чес
 
16.11.06
10:33
(3) Господа, пришла тут выписка из банка.
Вот причем...
7 Deon
 
16.11.06
10:39
(6) Мне нужен парсинг комментов. Комменты от банка не зависят
8 Deon
 
16.11.06
10:40
(5)
Оплата по сч. 846 от 02.06.06 за товар. В т.ч. НДС 18 % 477,00
Оплата за оборудование, согл. сч.-ф.N 470 от 24.04.2006 г. в т.ч. НДС(18%) -
Оплата за товар по счету 370
...
9 Чес
 
16.11.06
10:42
(8)
(7) А откуда у тебя, как ты выразился "комменты"?
10 birkoFFFF
 
16.11.06
10:43
(9) комменты пишет те кто платежки отправляют, в назначении платежа
11 Deon
 
16.11.06
10:43
(9) Клиенты пишут в платежках
12 Deon
 
16.11.06
10:45
Я что единственный, кто видел выписку банка?
13 Чес
 
16.11.06
10:48
(11) А приходит эта информация как? Откуда?
14 Ёпрст2
 
16.11.06
10:49
(12) Как вариант ищи дату, всё что левее - нумер...Или юзай регулярные выражения ..
15 Deon
 
16.11.06
10:50
(13) Из банка. Но содержание комментов от банка не зависит.
16 Deon
 
16.11.06
10:51
(14) это не очень интеллектуально
17 Deon
 
16.11.06
10:51
пока написал так:

string    ls_source            // Строка для поиска
string    ls_spacesource        // Строка для поиска с пробелами
string ls_list[]                // Перечень вариантов обозначений типа документа
long    ll_list                    // Размер массиива обозначений
long n,i,j
string ls_v1_0, ls_v2_0    // Рабочие варианты найденных номеров документов
string ls_v1, ls_v2            // Варианты найденных номеров документов
long ll_pos, ll_pos2        // Для поиска в строке
long ll_nowsymb, ll_nowspacesymb    // Для поиска в строке с пробелами

ls_spacesource = as_source
// Уберем пробелы, чтобы легче искалось
ls_source = of_replacestring(as_source, " ", "")

// Проставим дополнительные варианты поиска
ls_list[1]=as_doctype
choose case as_doctype
   case "сч"
       ls_list[2]="счт"
       ls_list[3]="счет"
       ls_list[4]="счету"
       ls_list[5]="счета"
       ls_list[6]="счeту"
   case "сф"
       ls_list[2]="с/ф"
       ls_list[3]="с.ф"
       ls_list[4]="счет/ф"
       ls_list[5]="сч/ф"
       ls_list[6]="сч-ф"
       ls_list[7]="сч.ф"
       ls_list[8]="счф"
       ls_list[9]="счет-фактура"
       ls_list[10]="счет-фактуре"
       ls_list[11]="счету-фактуре"
       ls_list[12]="накл"
end choose

// Добавим варианты с точкой
ll_list=upperbound(ls_list)
for n=1 to ll_list
   ls_list[ll_list+n]=ls_list[n]+"."
next
// Добавим варианты с номерами
ll_list=upperbound(ls_list)
for n=1 to ll_list
   ls_list[ll_list+n*2 - 1]=ls_list[n]+"N"
   ls_list[ll_list+n*2]=ls_list[n]+"№"
next
               
ls_v1=''
ls_v2=''
ll_list=upperbound(ls_list)
for i = 1 to ll_list
   // Ищем вхождение варианта
   ll_pos = pos(upper(ls_source), upper(ls_list[i]))
   if ll_pos>0 then    // нашли
       // Найдем соответветствующую позицию в строке с пробелами
       ll_nowsymb = 0
       ll_nowspacesymb = 0
       for j = 1 to len(ls_spacesource)
           if mid(ls_spacesource,j,1) <> " " then ll_nowsymb++
           ll_nowspacesymb++
           if ll_nowsymb = ll_pos + len(ls_list[i]) then exit
       next
       // Найдем номер документа, отрезаемый пробелом
       ll_pos2 = pos( upper(mid(ls_spacesource,ll_nowspacesymb)) ," ")
       ls_v1_0 = ''
       if ll_pos2>0 then
           ls_v1_0 = trim( mid(ls_spacesource,ll_nowspacesymb, ll_pos2 - 1) )
       else
           ls_v1_0 = trim( mid(ls_spacesource,ll_nowspacesymb))
       end if
       
       if of_containnumbers(ls_v1_0) then        // берем только номер, в котором есть цифры и выбираем самый короткий
           if len(ls_v1_0) < len(ls_v1) or ls_v1='' then
               ls_v1 = ls_v1_0
           end if
       end if
       
       // Найдем номер документа, отрезанный "от"
       ll_pos2 = pos( upper(mid(ls_source,ll_pos)) ,"ОТ")
       ls_v2_0 = ''
       if ll_pos2>0 then
           ls_v2_0 = trim( mid(ls_source, ll_pos + len(ls_list[i]), ll_pos2 - 1 - len(ls_list[i])) )
       else
           ls_v2_0 = trim( mid(ls_source, ll_pos + len(ls_list[i])) )
       end if

       if of_containnumbers(ls_v2_0) then        // берем только номер, в котором есть цифры и выбираем самый короткий
           if len(ls_v2_0) < len(ls_v2) or ls_v2='' then
               ls_v2 = ls_v2_0
           end if
       end if

   end if
next

// Выберем более короткий из найденных вариантов
if len(ls_v1) < len(ls_v2) and len(ls_v1) > 0 then
   return ls_v1
else
   return ls_v2
end if
18 у лю 427
 
16.11.06
10:52
$50
19 Deon
 
16.11.06
10:53
(18) Кто-то взломал ник Пита или ты не дописал один нолик?
20 Чес
 
16.11.06
10:59
(17) Это ты хвастаешься? Так нечем.
21 Deon
 
16.11.06
11:01
(20) Это, чтобы моя мысль была ясна
22 Deon
 
16.11.06
11:07
всплыву
23 Чес
 
16.11.06
11:09
Так что это за исходник? У тебя в электронном виде приходит из системы клиент - банк выписка? Правильно?
ТЫ ее загружаешь в 1С? Правильно?
Тебе надо еще определить номер документа, по которому был платеж? Да?
Так зачем вот (17)?

Есть у меня один программист, ему надо было в свою программу из 7.7. торговли выгружать номера расходных накладных за день. Раз в день. Зачем - то. Я ему предложил и OLE, и дбф, и csv, ну короче что хошь. Он сказал что сам сделает, без средств 1С. На С++ написал читальщик напрямую из dbf файла.
Так это все потому что малоопытный еще, не лень писать.
24 birkoFFFF
 
16.11.06
11:10
(23) ты хоть раз видел формат в котором выписки выгружаются?
25 Deon
 
16.11.06
11:11
(23) Просто я не 1С-ник :) Мне принцип важен, а не язык реализации. А вообще мне нужно именно то, о чем ты говоришь
26 Чес
 
16.11.06
11:19
(24) Зависит от клиент банка. От дбф до вордовских документов. И, поверь, пока у франча работал, насмотрелся всяких
(25) Так я тебе говорю. Звони ближайшему франчу, говори - мне нужна загрузка из клиент - банка такой - то системы. От 50$ до 80$.
А вообще такие вещи лучше на 1С писать. Там, поверь, это будет проще, чем на С.
27 Deon
 
16.11.06
11:25
(26) У меня в конторе база не 1С.
И эта загрузка мне будет доставать нужный номер документа из комментария?
28 Deon
 
16.11.06
11:36
всплыву2
29 Прохожий
 
16.11.06
11:38
*24) MT102 - СНГовённый "стандарт" межбанковских сообщений, другого вроде нет "формата".
30 Прохожий
 
16.11.06
11:39
(26) "От дбф до вордовских документов" - это тебе тоже пионэр напиал?
31 birkoFFFF
 
16.11.06
11:42
(29) вот и я про то-же, это текстовый файлик с разделителями, где там dbf и ворд не могу понять...
32 Deon
 
16.11.06
11:46
Да хоть в формате скана бумажной платёжки, назначение я сам добуду, мне не это недо
33 Deon
 
16.11.06
11:47
недо = надо
34 Прохожий
 
16.11.06
11:48
"в формате скана бумажной платёжки" - и такой формат бывает? Чего только не курят эти аборигены...
35 Deon
 
16.11.06
11:49
(34) можно и такой создать :)
36 birkoFFFF
 
16.11.06
11:50
(32) мы тебе что, должны написать алгоритм интеллектуального метода вытаскивания вида и номера документа из строки, или что?
(34) главное придумать зачем
37 Deon
 
16.11.06
11:51
(36) Напишу сам. Интересны идеи, мысли. Или готовые решения
38 birkoFFFF
 
16.11.06
11:55
Готовых решений извини нет, но что-то наподобие было, похоже на то что ты написал

Но ты с начала определись насколько тебе это нужно, потому как:

Конрагенты в назначении платежа в трети случаев пишут непойми что, могут и в номере документа ошибится, и орфографических ошибок наделать, поэтому до полной автоматизации в любом случае дело не дойдет, от работы человека отказаться не получиться, перепроверять все равно придется
39 Прохожий
 
16.11.06
11:57
(37) Готовое решение "тетя Дуся (СССР)" алгоритм распространенный, легко заменяется, работает автономно...
40 Прохожий
 
16.11.06
11:58
+(39) Широко представлен в парке...
41 birkoFFFF
 
16.11.06
11:58
+(38)проверено на 3500 клиентов, плательщиков абонентской платы, при этом во всех счетах, счет-фактурах и актах было расписано как должно оформлятся назначение платежа
Не думаю что у вас клиенты более дисциплинированные...
42 Deon
 
16.11.06
11:58
(38) Объем уменьшится - это самое главное
43 birkoFFFF
 
16.11.06
12:01
(38) Поверь мне уменьшится не на много, зато у оператора появится новый повод спирать свои ошибки на другого, а этим другим окажешься ты со своей программкой.
Она будет начальству говорить что это не она, а твоя программка неправильные документы поставила и никому ничего не докажешь.
44 birkoFFFF
 
16.11.06
12:02
не 38, а 42 сорри
45 Deon
 
16.11.06
12:50
(43) Не будет :)
46 birkoFFFF
 
16.11.06
12:56
(45) в таком случfе желаю удачи :-))