Перевод номера банковского счета в стандарт IBAN для Украины

Перевод номера банковского счета в стандарт IBAN (только для Украины). Функции для повторного использования и демо-обработка для платформы 1С 8.х. Тестировалась на платформе 1С 8.3.12.1529

Формат кода IBAN включает

  • 1—2 символы — код страны, где находится банк получателя (в соответствии со стандартом ISO 3166-1 alpha-2)
  • 3—4 символы — контрольное уникальное число IBAN, рассчитываемое по стандарту (ISO 7064)
  • 5—34 символы — Basic Bank Account Number (BBAN), базовый номер банковского счёта, включающий, как минимум, сам номер счёта, так и признак банка получателя (в том числе код филиала банка). Длина и содержание этой части IBAN зависят от выбора конкретной страны, но ограничиваются максимум 30 знаками.

Источник: https://ru.wikipedia.org/wiki/IBAN

Для Украины длина номера IBAN 29 символов

Предпочтительный алгоритм:
   1. Проверить, что общая длина IBAN является правильной согласно стране. Если нет, IBAN является недействительным.
   2. Замените две контрольные цифры на 00 (например, UA00 для Украины).
   3. Переместить четыре начальных символа в конец строки.
   4. Заменить буквы в строке цифрами, расширив строку при необходимости, чтобы A или a = 10, B или b = 11 и Z или z = 35. Таким образом, каждый алфавитный символ заменяется 2 цифрами
   5. Преобразовать строку в целое число (то есть игнорировать начальные нули).
   6. Вычислить mod-97 из нового числа, в результате чего получится остаток.
   7. Вычислить остаток от 97; полученный результат отнять от 98 и использовать результат для двух контрольных цифр. Если результатом является однозначное число, добавьте к нему начальный 0, чтобы сделать двузначное число.

Поэтапный расчет D mod 97 может быть выполнен разными способами. Один из таких способов заключается в следующем:

   1. Начиная с самой левой цифры D, составьте число, используя первые 9 цифр, и назовите его N.
   2. Рассчитать N мод 97.
   3. Создайте новый 9-значный N путем объединения вышеуказанного результата (шаг 2) со следующими 7 цифрами D. Если в D осталось менее 7 цифр, но хотя бы один, то создайте новый N, который будет иметь менее 9 цифры из вышеприведенного результата (шаг 2), за которыми следуют оставшиеся цифры D
    4. Повторяйте шаги 2–3, пока все цифры D не будут обработаны

Результатом окончательного расчета на шаге 2 будет D mod 97 = N mod 97.
 

пример алгоритма mod 97

В этом примере вышеупомянутый алгоритм для D mod 97 будет применен к D = 3214282912345698765432161182. (Цифры имеют цветовую кодировку, чтобы помочь описанию ниже.) Если результат равен единице, IBAN, соответствующий D, проходит проверку контрольной цифры.

    Построить N из первых 9 цифр D

        N = 321428291

    Рассчитать N мод 97 = 70
    Создайте новый 9-значный N из вышеуказанного результата (шаг 2), а затем следующие 7 цифр D.

        N = 702345698

    Рассчитать N мод 97 = 29
    Создайте новый 9-значный N из приведенного выше результата (шаг 4), а затем следующие 7 цифр D.

        N = 297654321

    Рассчитать N мод 97 = 24
    Создайте новый N из приведенного выше результата (шаг 6), а затем оставшиеся 5 цифр D.

        N = 2461182

    Рассчитать N мод 97 = 1

Начиная с шага 8, конечный результат — D mod 97 = 1

Для проверки генерации IBAN можно использовать ряд сайтов, например, https://bank.codes/iban/generate/ukraine/

Программный код обработки:

Функция ПеревестиБуквыВЦифрыДляМсчета(знак)
Если найти("0123456789", "" + знак)>0 тогда
//это изначально цифра
возврат "" + знак;
Иначе
//буква
возврат "" + (10 + (кодсимвола(нрег(знак),1)-кодсимвола("a",1)));
КонецЕсли;
КонецФункции

Функция КонтрольнаяСумма(кс)
Если стрдлина(кс)<>29 Тогда
Сообщить ("номер счета не для Украины");
Возврат "00";
КонецЕсли;
//переставляем UA00 в конец
кс = сред(кс, 5, 25) + сред(кс,1,4);
кс2 = "";
для сч = 1 по 29 цикл
кс2 = кс2 + ПеревестиБуквыВЦифрыДляМсчета(сред(кс,сч, 1));
конеццикла;
//алгоритм mod 97
для сч = 0 по 10 цикл
кс2 = ("" + (число(сред(кс2,1,9)) % 97) + сред(кс2, 10));
конеццикла;
возврат прав("00"+(98-число(кс2)),2);
КонецФункции

Функция СчетВМеждународномФормате(счет, мфо)
счет_ = сокрлп(счет);
мфо_ = сокрлп(мфо);
длина_счет = стрдлина(счет_);
длина_мфо = стрдлина(мфо_);
длинанулей = 29 - 2 - 2 - длина_мфо -длина_счет;
кс = КонтрольнаяСумма("UA00" + мфо_ + прав("00000000000000000000000000000", длинанулей) + счет_);
возврат "UA" + кс + мфо_ + прав("00000000000000000000000000000", длинанулей) + счет_;
КонецФункции

Процедура КнопкаВыполнитьНажатие(Кнопка)
IBAN = СчетВМеждународномФормате(СтарыйСчет,мфо);
КонецПроцедуры

 

6 Comments

  1. eact

    Автор, есть проверка генерации для 1С? (Проверка счета на корректность IBAN)

    Reply
  2. alexpot

    Номер можно проверить на сайте, например, https://bank.codes/iban/generate/ukraine/. В обработке только перевод старого номера счета в IBAN

    Reply
  3. alur

    Всё гораздо проще:

    Функция ПолучитьНомерСчетаIBAN(Страна, МФО, РСчет)
    
    сРезультат = СтроковыеФункцииКлиентСервер.ДополнитьСтроку(МФО, 6, «0», «Слева»)
    + СтроковыеФункцииКлиентСервер.ДополнитьСтроку(РСчет, 19, «0», «Слева»);
    
    СтрокаСтраны = Формат(КодСимвола(Сред(Страна, 1, 1)) — 55, «ЧЦ=2; ЧДЦ=0; ЧН=; ЧВН=; ЧГ=»)
    + Формат(КодСимвола(Сред(Страна, 2, 1)) — 55, «ЧЦ=2; ЧДЦ=0; ЧН=; ЧВН=; ЧГ=»);
    
    Если Не СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(сРезультат + СтрокаСтраны, Истина, Ложь) Тогда
    Возврат РСчет;
    КонецЕсли;
    
    ЧислоРасчета = Число(сРезультат + СтрокаСтраны);
    КонтрольнаяСумма = 98 — ЧислоРасчета * 100 % 97;
    СтрокаКС = Формат(КонтрольнаяСумма, «ЧЦ=2; ЧДЦ=0; ЧН=; ЧВН=; ЧГ=»);
    
    сРезультат = Страна + СтрокаКС + сРезультат;
    
    Если УправлениеДенежнымиСредствами.НомерБанковскогоСчетаСоответствуетСтандартуIBAN(сРезультат) Тогда
    Возврат сРезультат;
    Иначе
    Возврат РСчет;
    КонецЕсли;
    
    КонецФункции

    Показать

    Reply
  4. alur

    (1)условие проверки: число счета (с перекодированными символами) % 97 = 1

    Reply
  5. eact

    Может есть у кого функция на проверку корректности номера счета стандарту IBAN по контрольной!!! сумме (не просто на количество символов и присутствие символов «UA»)?

    Reply
  6. alur

    (5) как-то так:

    Функция НомерБанковскогоСчетаСоответствуетСтандартуIBAN(сIBAN)
    
    сIBANРаскодированный = Сред(сIBAN, 5)
    + Формат(КодСимвола(Сред(сIBAN, 1, 1)) — 55, «ЧЦ=2; ЧН=; ЧВН=»)
    + Формат(КодСимвола(Сред(сIBAN, 2, 1)) — 55, «ЧЦ=2; ЧН=; ЧВН=»)
    + Сред(сIBAN, 3, 2);
    
    Если СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(сIBANРаскодированный) Тогда
    Возврат сIBANРаскодированный % 97 = 1;
    Иначе
    Возврат Ложь;
    КонецЕсли;
    
    КонецФункции

    Показать

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *