Алгоритм проверки ИНН

Информация про алгоритм проверки ИНН пригодится тем, кто создаёт программное обеспечение для заполнения деклараций, для учёта контрагентов и других случаев, когда желательно иметь верные данные о налогоплательщике. Алгоритм используется в номерах, которые присваивают в России. Номер налогоплательщика у юридических лиц и физических отличается длиной, следовательно и алгоритмом проверки будет иметь отличия. Понятно и просто алгоритм проверки ИНН для обоих категорий налогоплательщиков описан в Википедии. Сперва рассмотрим алгоритм проверки ИНН для ЮЛ: последняя десятая цифра является контрольной. Вычисление проводится по формуле:
  • n10 = ((2n1 + 4n2 + 10n3 + 3n4 + 5n5 + 9n6 + 4n7 + 6n8 + 8n9) mod 11) mod 10,
где nx - номер в проверяемом номере, а mod 11 и mod 10 - остатки от деления. Проще говоря, каждый разряд ИНН умножается на соответствующий коэффициент, полученные числа суммируются, потом поочерёдно вычисляется остаток от деления на 11 и на 10. Получившееся число должно быть равно десятому разряду в ИНН. Забегая вперёд, на этом этапе можно выделить коэффициенты: (2, 4, 10, 3, 5, 9, 4, 6, 8), так как они нам понадобятся. Теперь можно перейти к рассмотрению ИНН для физических лиц. Алгоритм проверки ИНН для ФЛ чуть длиннее, так как приходится вычислять два числа, потому что контрольными являются 11 и 12 число в номере. Формулы для их вычисления:
  • n11 = (7n1 + 2n2 + 4n3 + 10n4 + 3n5 + 5n6 + 9n7 + 4n8 + 6n9 + 8n10) mod 11) mod 10);
  • n12 = (3n1 + 7n2 +2n3 + 4n4 + 10n5 + 3n6 + 5n7 + 9n8 + 4n9 + 6n10 + 8n11) mod 11) mod10).
Вероятно, вы заметили закономерность использования коэффициентов, которые были выписаны для проверки ИНН у ЮЛ. Проверка ИНН для физ. лиц аналогична - считается сумма произведений разрядов номера на коэффициенты, после чего берётся остаток от поочерёдного деления с остатком на 11 и 10. В качестве примера приведу реализацию проверки инн на питоне:
def check_inn(inn):
    if len(inn) not in (10, 12):
        return False

    def inn_csum(inn):
        k = (3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8)
        pairs = zip(k[11-len(inn):], [int(x) for x in inn])
        return str(sum([k * v for k, v in pairs]) % 11 % 10)

    if len(inn) == 10:
        return inn[-1] == inn_csum(inn[:-1])
    else:
        return inn[-2:] == inn_csum(inn[:-2]) + inn_csum(inn[:-1])
Суть функции проста: проверяется, чтобы длина ИНН соответствовала 10 или 12 символам. В зависимости от длины inn функция вернёт True/False о соответствии контрольных значений в номере. В списке k определены все используемые коэффициенты, но в зависимости от длины ИНН определяется используемая часть внутри inn_csum. Если внимательно посмотреть, алгоритм проверки ИНН при уменьшении номера пропорционально сдвигает используемые коэффициенты. Как видно, проверить правильность вводимого ИНН достаточно просто, а алгоритм проверки можно доработать, например, при неправильной контрольной сумме предлагать возможные варианты.

комментария 4

  1. Los:

    Укажите явно, что это для РФ. Для других стран постСНГ алгоритмы могут отличаться

    • admin:

      Добавил в шапку информацию, что этот алгоритм для ИНН в РФ, спасибо за замечание.

  2. Марат:

    Пишу проверку контрагентов в 1с. Для проверки взял ИНН существующей организации:
    1654019570. После перемножения коэффициэнтов и складывания сумм получается 2019. Делим на 11, будет 19. Делим на 10, останется 1. Оно не совпадает с 10-м числом инн организации. Что я делаю не так?

    • admin:

      Здравствуйте.

      Сумма первых девяти цифр, умноженных на коэффициенты: 219 (2 * 1 + 4 * 6 + 10 * 5 + 3 * 4 + 5 * 0 + 9 * 1 + 4 * 9 + 6 * 5 + 8 * 7).
      Остаток от деления на 11: 10 (219 mod 11 -> 19 * 11 + 10 ).
      Остаток от деления на 10 предыдущего числа: 0 (10 mod 10 -> 10 * 1 + 0).
      0 == 0.
      Всё, что в скобках до “->”, можете вставить в поисковую строку Гугла – встроенный в сервис калькулятор покажет такие же результаты.

      Так что ИНН МинФина Татарстана правильный :)

Добавить комментарий

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.