Две функции для проверки валидности ИНН, на пхп и яваскрипте

Не так давно столкнулся с проблемой — каким образом выявить неправильные ИННы из довольно большого списка? Поначалу я попытался сделать ограничение на длину вводимого номера не меньше шести цифр. Но это исключило лишь совсем неправильные записи. Важнее было исключить опечатки. Почитав об ИНН на википедии, я выяснил, что сам номер содержит в себе контрольное число, по которому с большой вероятностью можно выявить ошибочные записи. После этого родились две функции, которые работают по разные стороны сервера :-)

Функция на пхп с успехом была протестирована на более чем тысяче записей и показала очень впечатляющий результат. Функция на яваскрипте возникла в результате копипаста из пхп и, вероятно, также успешно работает (я проверял лишь на паре записей).

Функция для проверки правильности ИНН на PHP
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
<?php
/**
 * Функция проверяет правильность инн
 *
 * @param string $inn
 * @return bool
 */
function is_valid_inn( $inn )
{
    if ( preg_match('/\D/', $inn) ) return false;
    
    $inn = (string) $inn;
    $len = strlen($inn);
    
    if ( $len === 10 )
    {
        return $inn[9] === (string) (((
            2*$inn[0] + 4*$inn[1] + 10*$inn[2] + 
            3*$inn[3] + 5*$inn[4] +  9*$inn[5] + 
            4*$inn[6] + 6*$inn[7] +  8*$inn[8]
        ) % 11) % 10);
    }
    elseif ( $len === 12 )
    {
        $num10 = (string) (((
             7*$inn[0] + 2*$inn[1] + 4*$inn[2] +
            10*$inn[3] + 3*$inn[4] + 5*$inn[5] + 
             9*$inn[6] + 4*$inn[7] + 6*$inn[8] +
             8*$inn[9]
        ) % 11) % 10);
        
        $num11 = (string) (((
            3*$inn[0] +  7*$inn[1] + 2*$inn[2] +
            4*$inn[3] + 10*$inn[4] + 3*$inn[5] +
            5*$inn[6] +  9*$inn[7] + 4*$inn[8] +
            6*$inn[9] +  8*$inn[10]
        ) % 11) % 10);
        
        return $inn[11] === $num11 && $inn[10] === $num10;
    }
    
    return false;
}
?>
Функция для проверки правильности ИНН на яваскрипте
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
<script type="text/javascript">
// Функция для проверки правильности ИНН
function is_valid_inn(i)
{
    if ( i.match(/\D/) ) return false;
    
    var inn = i.match(/(\d)/g);
    
    if ( inn.length == 10 )
    {
        return inn[9] == String(((
            2*inn[0] + 4*inn[1] + 10*inn[2] + 
            3*inn[3] + 5*inn[4] +  9*inn[5] + 
            4*inn[6] + 6*inn[7] +  8*inn[8]
        ) % 11) % 10);
    }
    else if ( inn.length == 12 )
    {
        return inn[10] == String(((
             7*inn[0] + 2*inn[1] + 4*inn[2] +
            10*inn[3] + 3*inn[4] + 5*inn[5] +
             9*inn[6] + 4*inn[7] + 6*inn[8] +
             8*inn[9]
        ) % 11) % 10) && inn[11] == String(((
            3*inn[0] +  7*inn[1] + 2*inn[2] +
            4*inn[3] + 10*inn[4] + 3*inn[5] +
            5*inn[6] +  9*inn[7] + 4*inn[8] +
            6*inn[9] +  8*inn[10]
        ) % 11) % 10);
    }
    
    return false;
}
</script>

Зачем нужен ИНН?

У Вас возник вопрос: «А чего такого ценного в ИНН, что его надо так проверять?». Ответ прост — только ИНН гарантирует правильную автоматизацию безналичных денежных расчётов между двумя юридическими лицами. То есть, если Вы автоматизируете крупное предприятие, которое завязано на безналичном расчёте, то только ИНН, как уникальный идентификатор юр. лица, даст гарантию правильного учёта поступивших/отправленных денежных средств.

При этом существует серьёзная проблема — если ИНН заводится руками, то велика вероятность ошибки. Такие ошибки легко сделать, но трудно выявить, хотя именно на ИНН строится вся система бухгалтерских счетов на оплату. Именно поэтому очень важно отследить правильность ввода ИНН на начальном этапе.

Примеры использования

Пример проверки на PHP:

1
2
3
4
<?php
var_dump(is_valid_inn('1234567890'));  // bool(false)
var_dump(is_valid_inn('1234567894'));  // bool(true)
?>

Пример проверки ИНН при вводе в текстовое поле средствами JavaScript:

1
<input type="text" onkeyup="this.style.backgroundColor = is_valid_inn(this.value) ? '#dfd' : '#fdd'" />

Дата публикации: 4 августа 2009 года.