Блин неохота искать. А вообще у меня совпадало всегда если БИК задан. Так что...
Вот код:
*!* ---------------------------------------- /*
FUNCTION CheckAccount
*!* ---------------------------------------- /*
*!* Проверка корректности 20-и разрядного банковского счета
*!* Данная процедура анализирует ЛЮБОЙ 20-разрядный банковский счет
*!* (корреспондирующиий, расчетный, бюджетный и т.п.)
*!* ---------------------------------------- /*
*!* Параметры
*!* 1. tcAccount - 20-и разрядный банковский счет (символьный тип)
*!* 2. tcBIK - 9-и разрядный БИК. Может быть как символьного, так и числового типа
*!* 3. tlIsCorAccount- осуществляется ли проверка корреспондирующего счета или нет
*!* .T. - Да, проверяется Кор.счет
*!* .F. - Нет (по-умолчанию), проверяется НЕ Кор.счет
*!* !ВНИМАНИЕ !
*!* В процессе выполнения функции значение параметров может меняться, поэтому
*!* не следует использовать передачу параметров по ссылке
*!* ---------------------------------------- /*
*!* Выполняемые проверки
*!* - БИК - это всегда число, количество разрядов которого не превышает 9
*!* Использование в нем символов отличных от цифр недопустимо.
*!* - счет всегда имеет 20 знаков
*!* - в счете присутствуют только цифры, но в 6 разряде возможно наличие буквы из
*!* фиксированного набора - это возможно при использовании клиринговой валюты (редкий случай)
*!* - при расчете контрольных сумм используется фрагмент из БИК
*!* - первая контрольная цифра содержится в 9 разряде счета
*!* - итоговое контрольное число должно оканчиваться нулем
*!* ---------------------------------------- /*
*!* Возвращает .T. - если счета записаны корректно и .F. - если нет
*!* ---------------------------------------- /*
*!* Замечания
*!* Исходный код программы предоставил Орлов Дмитрий Георгиевич (Jimmy), поэтому о методике расчета
*!* контрольных сумм я ничего сказать не могу. Я лишь немного изменил стиль кода не меняя
*!* его содержимого и немного подправил выбор для расчет контрольной суммы БИК
*!* ---------------------------------------- /*
PARAMETERS tcAccount,tcBIK,tlIsCorAccount
IF EMPTY(m.tcAccount)
RETURN .t.
ENDIF
LOCAL llIsCorrect
llIsCorrect = .T.
* Проверка правильности ТИПА и длины переданных параметров
* и приведение их к нужному типу если это необходимо
IF TYPE("tlIsCorAccount")<>"L"
tlIsCorAccount=.F.
ENDIF
DO CASE
CASE TYPE("tcBIK")="C"
tcBIK=AllTrim(m.tcBIK)
CASE TYPE("tcBIK")="N"
tcBIK=LTRIM(STR(m.tcBIK,20))
OTHERWISE
llIsCorrect = .F.
ENDCASE
IF LEN(m.tcBIK)>9
llIsCorrect = .F.
ELSE
tcBIK=PADL(m.tcBIK,9,"0")
ENDIF
IF TYPE("tcAccount")="C"
tcAccount = UPPER(AllTrim(m.tcAccount))
IF LEN(m.tcAccount)<>20
llIsCorrect = .F.
ENDIF
ELSE
llIsCorrect = .F.
ENDIF
LOCAL lnI
* Проверка содержимого БИК
IF m.llIsCorrect = .T.
FOR lnI=1 TO LEN(m.tcBIK)
IF IsDigit(SubStr(m.tcBIK,m.lnI,1))=.F.
llIsCorrect = .F.
ENDIF
ENDFOR
ENDIF
* Символы, допустимые в 6 разряде счета, с учетом возможного их написания как
* на латинской, так и на русской раскладке (Lat+Рус) и цифры на которые их следует заменить
LOCAL lcPossibleCharacters, lcChangingDigits
lcPossibleCharacters = 'ABCEHKMPTXАВСЕНКМРТХ'
lcChangingDigits = '01234567890123456789'
* Проверка содержимого Счета
IF llIsCorrect = .T.
FOR lnI=1 TO LEN(m.tcAccount)
IF IsDigit(SubStr(m.tcAccount,m.lnI,1))=.F.
IF m.lnI=6 AND SubStr(m.tcAccount,m.lnI,1) $ m.lcPossibleCharacters
* Если в 6 разряде оказался один из допустимых символов, то
* заменяю символ буквы на соответсвующую цифру
tcAccount = LEFT(m.tcAccount,5)+;
SubStr(m.lcChangingDigits,AT(SubStr(m.tcAccount,m.lnI,1),m.lcPossibleCharacters),1)+;
RIGHT(m.tcAccount,14)
ELSE
llIsCorrect = .F.
ENDIF
ENDIF
ENDFOR
ENDIF
* Массив весовых коэффициентов каждой позиции символа в счете
LOCAL laVes(20)
laVes(1)=7
laVes(2)=1
laVes(3)=3
laVes(4)=7
laVes(5)=1
laVes(6)=3
laVes(7)=7
laVes(8)=1
laVes(9)=3
laVes(10)=7
laVes(11)=1
laVes(12)=3
laVes(13)=7
laVes(14)=1
laVes(15)=3
laVes(16)=7
laVes(17)=1
laVes(18)=3
laVes(19)=7
laVes(20)=1
* Расчет контрольных сумм
IF m.llIsCorrect = .T.
* Выбор строки из БИК для расчета контрольной суммы
* При расчете контрольной суммы корреспондирующего счета
* всегда используется условный номер РКЦ
LOCAL lcCheckStringBIK
IF VAL(SUBSTR(m.tcBIK,7,3)) < 10 OR m.tlIsCorAccount=.T.
lcCheckStringBIK = '0'+SUBSTR(m.tcBIK,5,2) && Условный номер РКЦ
ELSE
lcCheckStringBIK = SUBSTR(m.tcBIK,7,3) && Условный номер кредитной организации
ENDIF
* Расчет 2 контрольных сумм собственно счета
LOCAL lnCheckSum9, lnCheckSumAccount
STORE 0 TO m.lnCheckSum9, m.lnCheckSumAccount
FOR lnI=1 TO 3
lnCheckSum9 = m.lnCheckSum9 + VAL(SubStr(m.lcCheckStringBIK,m.lnI,1))*laVes(m.lnI)
lnCheckSumAccount = m.lnCheckSumAccount + VAL(SubStr(m.lcCheckStringBIK,m.lnI,1))*laVes(m.lnI)
ENDFOR
FOR lnI=1 TO 20
IF m.lnI<>9
lnCheckSum9 = m.lnCheckSum9 + VAL(SubStr(m.tcAccount,m.lnI,1))*laVes(m.lnI)
ENDIF
lnCheckSumAccount = m.lnCheckSumAccount + VAL(SubStr(m.tcAccount,m.lnI,1))*laVes(m.lnI)
ENDFOR
lnCheckSum9 = MOD(MOD(m.lnCheckSum9,10)*laVes(9),10)
lnCheckSumAccount = MOD(m.lnCheckSumAccount,10)
* Проверка правильности найденных контрольных сумм счета
IF VAL(SubStr(m.tcAccount,9,1))<>m.lnCheckSum9 OR m.lnCheckSumAccount<>0
llIsCorrect=.F.
ENDIF
ENDIF
RETURN (m.llIsCorrect)
------------------
PS Недочитал тему до конца...