powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как проконтролировать двадцатипятизначный УИП в платежке ?
2 сообщений из 2, страница 1 из 1
Как проконтролировать двадцатипятизначный УИП в платежке ?
    #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
Как проконтролировать двадцатипятизначный УИП в платежке ?
    #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
2 сообщений из 2, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как проконтролировать двадцатипятизначный УИП в платежке ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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