Структура IBAN устроена как компромисс между двумя целями: единым международным каркасом и полной свободой национальных систем. Ниже разберём, из каких частей состоит такой номер, откуда берутся две контрольные цифры, зачем внутри национальной части появляется ещё одна проверка, что именно считает алгоритм по модулю девяносто семь и где заканчивается то, о чём строка вообще способна что-то сообщить.
Из каких частей состоит номер счёта?
У этого номера три смысловые части, и границы между ними заданы международным стандартом только для первых двух.
| Часть | Сколько знаков | Кто устанавливает правило |
|---|---|---|
| Код страны | две буквы | международный стандарт |
| Контрольные цифры стандарта | две цифры | международный стандарт |
| Национальная часть | переменно | национальная система страны |
- Код страны. Две буквы, обозначающие страну, чьи правила применяются к остальной части номера.
- Контрольные цифры стандарта. Две цифры, вычисленные по международному правилу из всех остальных знаков.
- Национальная часть. Всё, что осталось. Её длину и внутреннее устройство каждая страна определяет самостоятельно.
Такое разделение объясняет главную практическую особенность: международный стандарт фиксирует только то, что нужно для однозначного прочтения номера за границей, а детали отдаёт национальным системам. Именно поэтому один и тот же по смыслу номер в двух странах выглядит по-разному и имеет разную длину.
Отсюда первый важный вывод для практики. Любая попытка написать одно универсальное правило проверки по длине обречена: то, что верно для одной страны, отсечёт корректные номера другой. Длину и внутреннее устройство приходится брать из описания конкретной страны, а не из общей формулы.
Код страны и две контрольные цифры
Первые две буквы — это код страны, и он же определяет, чьё национальное описание нужно подключать дальше. Следующие две цифры — единственная часть, которая вычисляется по международному правилу и потому проверяется одинаково для всех стран.
Смысл этих цифр узкий и полезный: они ловят опечатки при переписывании и при вводе с клавиатуры, причём одинаково успешно в любой стране. Две цифры вместо одной выбраны не случайно: чем больше возможных значений, тем меньше вероятность, что случайная ошибка оставит результат согласованным.
Важная особенность: контрольные цифры занимают фиксированную позицию сразу после кода страны, поэтому перестановка соседних знаков внутри национальной части смещает общее правило только в том случае, если затронуты позиции с разными весами. Общая природа таких правил, их сильные и слабые места разобраны отдельно в обзоре алгоритмов контрольной цифры.
Почему внутри национальной части бывает вторая проверка?
Национальная часть у многих стран устроена не как произвольный набор знаков, а как аккуратно сегментированная запись: код банка, код отделения, номер счёта. И во многих таких системах своя контрольная цифра появилась задолго до международного стандарта — она защищала номер при внутренних переводах.
В результате один номер может одновременно подчиняться двум правилам: международному, которое проверяет первые четыре знака и всю строку целиком, и национальному, которое проверяет свою часть внутри. Это не избыточность, а два независимых слоя защиты, появившиеся в разное время для разных задач.
Для проверки отсюда следует неприятное, но обязательное требование: нужно различать, какое именно правило не сработало. Сообщение «номер счёта неверен» в ответ на несогласованную национальную цифру бесполезно — человек пойдёт перепроверять страну и длину, которые на самом деле в порядке. Правильная формулировка указывает слой: международные цифры сошлись, а национальная часть не проходит внутреннюю проверку.
Как работает проверка по модулю девяносто семь?
Идея алгоритма укладывается в три действия, и её вполне достаточно, чтобы понимать, что происходит, не превращая статью в техническое руководство.
Сначала строку переставляют: код страны и следующие за ним контрольные цифры переносят в конец. Затем буквы заменяют числами по фиксированной схеме, превращая всю строку в длинную последовательность цифр. И наконец полученное число делят на девяносто семь, проверяя остаток.
Почему именно девяносто семь? Потому что это простое число, а значит, остатки распределяются равномерно и случайное совпадение маловероятно. Схема замены букв на числа тоже выбрана не произвольно: она превращает латинский алфавит в диапазоны, которые не создают искусственных закономерностей.
Полученная последовательность цифр выходит очень длинной — намного длиннее, чем любое число, с которым удобно работать напрямую. Поэтому в реализациях остаток считают постепенно, знак за знаком, а не пытаются поделить всю строку целиком. Для разбора на бумаге это тоже удобно: результат каждого шага невелик, и вычисление не требует запоминать длинные значения. Все числовые пояснения здесь приведены только для объяснения хода рассуждения; готовый номер, показанный где-либо как пример, всегда остаётся вымышленным.
Что означает пройденная проверка?
Ровно одно: строка составлена непротиворечиво по международному правилу. Это утверждение о записи, а не о счёте.
Строка ничего не сообщает о том, открыт ли счёт, кто его владелец, можно ли на него перечислить деньги и действует ли он сейчас. Все эти вопросы решаются в другой плоскости — обращением к системе, которая ведёт учёт счетов. Такое обращение требует сети, времени и работает не всегда, в отличие от арифметической проверки, которая выполняется мгновенно и без внешних зависимостей.
Отсюда следует правило формулировок, которое стоит соблюдать во всех интерфейсах: проверка отвечает на вопрос «записано ли значение непротиворечиво», и только на него. Переносить её вывод на вопрос о существовании счёта — значит обещать пользователю больше, чем вы можете подтвердить. Тот же принцип действует и для номеров, у которых контрольной цифры нет вовсе: там честный ответ ещё скромнее, и об этом стоит прочитать в материале про номера без контрольной цифры.
Как разработчику обойтись с разной длиной по странам
Первое и главное решение — не хранить длину в коде. Набор правил, разложенный по странам, должен лежать в данных: код страны, допустимая длина, схема национальной части. Тогда новая страна добавляется без правки логики, а исправление ошибки не требует выпуска новой версии программы.
Второе — приводите строку к каноническому виду до любых сравнений. Пробелы между группами, которые человек ставит для читаемости, не являются частью номера. Верхний и нижний регистр букв для правил тоже неразличим, но неразличим он для правила, а не для сравнения строк: если не выровнять регистр заранее, две одинаковые записи будут выглядеть разными.
Третье — не пытайтесь угадать страну по длине или по составу. Если код страны известен, он определяет и правило. Если неизвестен, честнее показать список возможных вариантов, чем выбрать один. Как устроен такой перебор в общем случае, описано в разборе проверки на нескольких уровнях.
Четвёртое — отдельно проектируйте сообщения. У вас должно быть минимум четыре разных ответа: всё сошлось, международные цифры не сошлись, национальная проверка не прошла, правило для этой страны не подключено. Пока все они выглядят как одна строка «неверный номер», пользователь не может ничего исправить.
Что делать дальше
Соберите список стран, с которыми реально работает ваша форма, и выясните для каждой только два факта: какова допустимая длина и есть ли внутри национальной части собственная проверка. Этого достаточно, чтобы перестать отвергать корректные значения.
Затем возьмите несколько вымышленных строк, собранных специально для испытаний, и прогоните их через инструмент проверки: он покажет нормализованный вид, разберёт номер по частям и отдельно сообщит, какой из слоёв проверки не согласовался. Все примеры в этой статье и в самом инструменте построены как учебные и не описывают ни один действующий счёт, поэтому по ним нельзя судить ни о владельце, ни о самом факте существования записи.