Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как проконтролировать двадцатипятизначный УИП в платежке ? / 2 сообщений из 2, страница 1 из 1
03.12.2014, 11:10
    #38823365
rv2plus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проконтролировать двадцатипятизначный УИП в платежке ?
Здравствуйте.
Написал функцию, но чувствую, что неправильно понял алгоритм.
Может у кого-нибудь уже есть готовое решение ?
Или объясните, пожалуйста, что я делаю не так.

автор*Приложение 12 к Положению Банка России от 19 июня 2012 года N 383-П "О правилах осуществления перевода денежных средств*

ПОРЯДОК
ФОРМИРОВАНИЯ ПОЛУЧАТЕЛЕМ СРЕДСТВ УНИКАЛЬНОГО ИДЕНТИФИКАТОРА
ПЛАТЕЖА И ЕГО КОНТРОЛЯ БАНКОМ ПЛАТЕЛЬЩИКА В СЛУЧАЕ ПЕРЕВОДА
ДЕНЕЖНЫХ СРЕДСТВ НА БАНКОВСКИЙ СЧЕТ ПОЛУЧАТЕЛЯ СРЕДСТВ,
ОТКРЫТЫЙ В ЦЕЛЯХ ИДЕНТИФИКАЦИИ ПЛАТЕЖА

Список изменяющих документов
(введен Указанием Банка России от 29.04.2014 N 3248-У)

1. Получатель средств формирует уникальный идентификатор платежа с учетом следующего: 1 разряд - контрольный ключ, 2 - 25 разряды - информация о платеже (2 - 16 разряды - цифры, 17 - 25 разряды - символы). Если часть символов уникального идентификатора платежа не используется, то свободные знаки обозначаются нулями.
2. Банк плательщика контролирует наличие в распоряжении в реквизите "Код" уникального идентификатора платежа при наличии в реквизите "Сч. N" получателя средств номера банковского счета получателя средств, открытого в целях идентификации платежа.
Банк плательщика контролирует уникальный идентификатор платежа посредством проверки контрольного ключа.
Контрольный ключ рассчитывается с применением 1 - 5 разрядов реквизита "Сч. N" получателя средств и 1 - 16 разрядов реквизита "Код", а также следующих весовых коэффициентов, установленных для каждого разряда:

Номера разрядов 1 2 3 4 5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Коэффициенты 3 7 1 3 7 3 7 1 3 7 3 7 1 3 7 3 7 1 3 7 3

Расчет контрольного ключа осуществляется в следующем порядке:
значение контрольного ключа приравнивается нулю;
рассчитываются произведения значений разрядов на соответствующие весовые коэффициенты;
рассчитывается сумма значений младших разрядов полученных произведений;
младший разряд вычисленной суммы умножается на три;
значение контрольного ключа принимается равным младшему разряду полученного произведения.
Проверка контрольного ключа осуществляется посредством расчета произведения значений разрядов на соответствующие весовые коэффициенты с учетом значения контрольного ключа. Значение контрольного ключа считается верным при получении суммы, кратной десяти.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
MESSAGEBOX(IIF(IsUIPCorrect('40822810704000005465', '1234567890123456ABCDEFGHI'),'УИП корректен','УИП некорректен'))
*
FUNCTION IsUIPCorrect
LPARAMETERS tcAcc AS String, tcUIP AS String
LOCAL lcSource AS String, lnCount AS Integer, lnControlKey AS Integer, lnCheckSum AS Integer
LOCAL ARRAY laWeight[21]
* ВЕСОВЫЕ КОЭФФИЦИЕНТЫ
laWeight[01] = 3
laWeight[02] = 7
laWeight[03] = 1
laWeight[04] = 3
laWeight[05] = 7
*
laWeight[06] = 3
laWeight[07] = 7
laWeight[08] = 1
laWeight[09] = 3
laWeight[10] = 7
*
laWeight[11] = 3
laWeight[12] = 7
laWeight[13] = 1
laWeight[14] = 3
laWeight[15] = 7
*
laWeight[16] = 3
laWeight[17] = 7
laWeight[18] = 1
laWeight[19] = 3
laWeight[20] = 7
*
laWeight[21] = 3
* 1) значение контрольного ключа приравнивается нулю
lcSource = LEFT(ALLTRIM(tcAcc), 5) + '0' + SUBSTR(ALLTRIM(tcUIP), 2, 15)
lnControlKey = 0
FOR lnCount = 1 TO 21
	* 2) рассчитываются произведения значений разрядов на соответствующие весовые коэффициенты
	* 3) рассчитывается сумма значений младших разрядов полученных произведений
	lnControlKey = lnControlKey + MOD(VAL(SUBSTR(lcSource, lnCount, 1)) * laWeight[lnCount], 10)
ENDFOR  
* 4) младший разряд вычисленной суммы умножается на три
* 5) значение контрольного ключа принимается равным младшему разряду полученного произведения
lnControlKey = MOD(MOD(lnControlKey, 10) * 3, 10)
?lnControlKey
* Проверка контрольного ключа осуществляется посредством расчета произведения значений разрядов на соответствующие весовые коэффициенты с учетом значения контрольного ключа.
* Значение контрольного ключа считается верным при получении суммы, кратной десяти.
lcSource = LEFT(ALLTRIM(tcAcc), 5) + TRANSFORM(lnControlKey) + SUBSTR(ALLTRIM(tcUIP), 2, 15)
lnCheckSum = 0
FOR lnCount = 1 TO 21
	lnCheckSum = lnCheckSum + VAL(SUBSTR(lcSource, lnCount, 1)) * laWeight[lnCount]
ENDFOR  
RETURN MOD(lnCheckSum, 10) = 0
...
Рейтинг: 0 / 0
03.12.2014, 14:24
    #38823680
rv2plus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проконтролировать двадцатипятизначный УИП в платежке ?
Непонятно излишнее и туманное описание алгоритма проверки вычисленного ключа, т.к. на входе мы уже знаем ключ и есть с чем сравить.
Проверка контрольного ключа осуществляется посредством расчета произведения значений разрядов на соответствующие весовые коэффициенты с учетом значения контрольного ключа. Значение контрольного ключа считается верным при получении суммы, кратной десяти.


Ниже усовершенствованный вариант. Я правильно мыслю ?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
MESSAGEBOX(IIF(IsUIPCorrect('40822810104000001234', '1234567890123456ABCDEFGHI'),'УИП корректен','УИП некорректен'))
MESSAGEBOX(IIF(IsUIPCorrect('40822810204000005678', '3234567890123456ABCDEFGHI'),'УИП корректен','УИП некорректен'))
*
FUNCTION IsUIPCorrect
LPARAMETERS tcAcc AS String, tcUIP AS String
LOCAL lcWeight AS String, lcString AS String, lnControlKey AS Integer, lnCount AS Integer
* ВЕСОВЫЕ КОЭФФИЦИЕНТЫ
lcWeight = REPLICATE('37137', 4) + '3'
* 1) значение контрольного ключа приравнивается нулю
lcString = LEFT(ALLTRIM(tcAcc), 5) + '0' + SUBSTR(ALLTRIM(tcUIP), 2, 15)
lnControlKey = 0
FOR lnCount = 1 TO 21
	* 2) рассчитываются произведения значений разрядов на соответствующие весовые коэффициенты
	* 3) рассчитывается сумма значений младших разрядов полученных произведений
	lnControlKey = lnControlKey + MOD(VAL(SUBSTR(lcString, lnCount, 1)) * VAL(SUBSTR(lcWeight, lnCount, 1)), 10)
ENDFOR  
* 4) младший разряд вычисленной суммы умножается на три
* 5) значение контрольного ключа принимается равным младшему разряду полученного произведения
lnControlKey = MOD(lnControlKey * 3, 10)
RETURN VAL(LEFT(tcUIP, 1)) = lnControlKey
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как проконтролировать двадцатипятизначный УИП в платежке ? / 2 сообщений из 2, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]