Как реализовать алгоритм проверки 12-значного ИНН в 1С

Программист Налоговый учет IT и автоматизация бизнеса
← На главную

При разработке систем автоматизации учета часто возникает задача проверки корректности вводимых данных. Одной из самых распространенных проверок является валидация Идентификационного номера налогоплательщика (ИНН). В то время как для юридических лиц используется 10-значный номер, для физических лиц и индивидуальных предпринимателей предусмотрен 12-значный формат. В этой статье мы подробно разберем математический алгоритм проверки 12-значного ИНН, проанализируем весовые коэффициенты и напишем эффективный код на языке 1С.

Структура 12-значного ИНН

Прежде чем переходить к коду, давайте разберем структуру номера. 12-значный ИНН состоит из следующих блоков:

  1. С 1 по 2 цифру — код субъекта РФ (регион).
  2. С 3 по 4 цифру — код налоговой инспекции.
  3. С 5 по 10 цифру — порядковый номер записи в реестре.
  4. 11 и 12 цифры — контрольные числа, которые вычисляются по специальному алгоритму.

Важно понимать: чтобы проверить валидность всего номера, нам нужно последовательно вычислить 11-ю цифру (на основе первых 10-ти) и 12-ю цифру (на основе первых 11-ти). Если обе расчетные цифры совпали с введенными, ИНН считается корректным.

Алгоритм расчета контрольных чисел

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

Шаг 1. Вычисление 11-го знака:

Для расчета используются первые 10 цифр ИНН. Каждая цифра умножается на свой весовой коэффициент из следующего ряда: (7, 2, 4, 10, 3, 5, 9, 4, 6, 8).

  1. Складываем все полученные произведения.
  2. Вычисляем остаток от деления полученной суммы на 11.
  3. Особое условие: если остаток равен 10, то контрольное число принимается равным 0. Если остаток меньше 10, то он и является контрольным числом.

Шаг 2. Вычисление 12-го знака:

Для расчета используются уже первые 11 цифр ИНН (включая только что проверенную или вычисленную 11-ю цифру). Весовые коэффициенты здесь другие: (3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8).

  1. Повторяем процедуру: умножаем цифры на коэффициенты и суммируем.
  2. Вычисляем остаток от деления на 11.
  3. Применяем то же правило для остатка 10: если получили 10, записываем 0.

Реализация алгоритма на языке 1С

Проанализируем наиболее эффективный способ реализации. Вместо написания громоздких конструкций с ручным извлечением каждого символа через Сред(), лучше использовать массивы для весовых коэффициентов. Это сделает код читаемым и легким для отладки.

Рассмотрим пример функции, которая возвращает Истина, если ИНН прошел проверку:


Функция ИННФизическогоЛицаКорректен(Знач ИНН) Экспорт
    
    // Проверка на длину строки
    Если СтрДлина(ИНН) <> 12 Тогда
        Возврат Ложь;
    КонецЕсли;

    // Проверка на то, что все символы — цифры
    Для Позиция = 1 По 12 Цикл
        Символ = Сред(ИНН, Позиция, 1);
        Если Найти("0123456789", Символ) = 0 Тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЦикла;

    // Подготовим весовые коэффициенты
    Веса11 = Новый Массив;
    // (7, 2, 4, 10, 3, 5, 9, 4, 6, 8)
    Веса11.Добавить(7); Веса11.Добавить(2); Веса11.Добавить(4); Веса11.Добавить(10);
    Веса11.Добавить(3); Веса11.Добавить(5); Веса11.Добавить(9); Веса11.Добавить(4);
    Веса11.Добавить(6); Веса11.Добавить(8);

    Веса12 = Новый Массив;
    // (3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8)
    Веса12.Добавить(3); Веса12.Добавить(7); Веса12.Добавить(2); Веса12.Добавить(4);
    Веса12.Добавить(10); Веса12.Добавить(3); Веса12.Добавить(5); Веса12.Добавить(9);
    Веса12.Добавить(4); Веса12.Добавить(6); Веса12.Добавить(8);

    // Рассчитываем 11-е контрольное число
    Сумма11 = 0;
    Для т = 0 По 9 Цикл
        Сумма11 = Сумма11 + Число(Сред(ИНН, т + 1, 1)) * Веса11[т];
    КонецЦикла;
    
    Контроль11 = Сумма11 % 11;
    Если Контроль11 > 9 Тогда
        Контроль11 = Контроль11 % 10;
    КонецЕсли;

    // Рассчитываем 12-е контрольное число
    Сумма12 = 0;
    Для т = 0 По 10 Цикл
        Сумма12 = Сумма12 + Число(Сред(ИНН, т + 1, 1)) * Веса12[т];
    КонецЦикла;

    Контроль12 = Сумма12 % 11;
    Если Контроль12 > 9 Тогда
        Контроль12 = Контроль12 % 10;
    КонецЕсли;

    // Проверяем соответствие
    Если (Число(Сред(ИНН, 11, 1)) = Контроль11) И (Число(Сред(ИНН, 12, 1)) = Контроль12) Тогда
        Возврат Истина;
    Иначе
        Возврат Ложь;
    КонецЕсли;

КонецФункции

Разбор нюансов и типичных ошибок

Проанализируем важные моменты, которые часто вызывают вопросы у разработчиков:

  1. Остаток от деления 10: В официальных описаниях алгоритма часто пишут "если остаток больше 9, то берется остаток от деления на 10". Это то же самое, что сказать: если получили 10, то контрольная цифра — 0. В коде выше мы использовали универсальную формулу Контроль % 10 для обработки этого случая.
  2. Использование массивов: Как было замечено в обсуждении темы, использование массивов делает код чище. Мы рекомендуем заранее инициализировать массивы весов, возможно, даже вынести их в константы или параметры сеанса, если проверка ИНН выполняется очень часто (например, при массовом импорте данных).
  3. Региональные отличия: Будьте внимательны при копировании кода из интернета. В некоторых сообщениях на форумах (например, Сообщение 15 в исходной теме) приводится алгоритм для ИИН/БИН Республики Казахстан. Несмотря на то, что там тоже 12 знаков, алгоритм расчета и весовые коэффициенты там совершенно иные. Российский ИНН проверяется строго по методике ФНС РФ.
  4. Тип данных: ИНН всегда следует хранить и передавать как Строка. Если использовать тип Число, вы потеряете ведущие нули (например, для регионов от 01 до 09), что сделает номер невалидным.

Дополнительные проверки (логический контроль)

Помимо математического расчета контрольной суммы, полезно внедрить дополнительные "быстрые" проверки, которые отсекают заведомо ошибочные данные:

Выясним причину, почему иногда алгоритм "не срабатывает". Чаще всего это происходит из-за неверного индекса в цикле или путаницы в коэффициентах (например, когда коэффициент для 11-го знака ошибочно применяют к 12-му). Используя наш пример с массивами, вы минимизируете риск таких ошибок.

Таким образом, мы рассмотрели полный цикл валидации ИНН: от понимания структуры номера до программной реализации в 1С. Этот алгоритм является стандартным и подходит для любых конфигураций на платформе 1С:Предприятие.

← На главную