При разработке систем автоматизации учета часто возникает задача проверки корректности вводимых данных. Одной из самых распространенных проверок является валидация Идентификационного номера налогоплательщика (ИНН). В то время как для юридических лиц используется 10-значный номер, для физических лиц и индивидуальных предпринимателей предусмотрен 12-значный формат. В этой статье мы подробно разберем математический алгоритм проверки 12-значного ИНН, проанализируем весовые коэффициенты и напишем эффективный код на языке 1С.
Прежде чем переходить к коду, давайте разберем структуру номера. 12-значный ИНН состоит из следующих блоков:
Важно понимать: чтобы проверить валидность всего номера, нам нужно последовательно вычислить 11-ю цифру (на основе первых 10-ти) и 12-ю цифру (на основе первых 11-ти). Если обе расчетные цифры совпали с введенными, ИНН считается корректным.
Рассмотрим пошагово, как производятся вычисления. Алгоритм базируется на суммировании произведений разрядов ИНН на определенные весовые коэффициенты.
Шаг 1. Вычисление 11-го знака:
Для расчета используются первые 10 цифр ИНН. Каждая цифра умножается на свой весовой коэффициент из следующего ряда: (7, 2, 4, 10, 3, 5, 9, 4, 6, 8).
Шаг 2. Вычисление 12-го знака:
Для расчета используются уже первые 11 цифр ИНН (включая только что проверенную или вычисленную 11-ю цифру). Весовые коэффициенты здесь другие: (3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8).
Проанализируем наиболее эффективный способ реализации. Вместо написания громоздких конструкций с ручным извлечением каждого символа через Сред(), лучше использовать массивы для весовых коэффициентов. Это сделает код читаемым и легким для отладки.
Рассмотрим пример функции, которая возвращает Истина, если ИНН прошел проверку:
Функция ИННФизическогоЛицаКорректен(Знач ИНН) Экспорт
// Проверка на длину строки
Если СтрДлина(ИНН) <> 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) Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
Проанализируем важные моменты, которые часто вызывают вопросы у разработчиков:
Контроль % 10 для обработки этого случая.Строка. Если использовать тип Число, вы потеряете ведущие нули (например, для регионов от 01 до 09), что сделает номер невалидным.Помимо математического расчета контрольной суммы, полезно внедрить дополнительные "быстрые" проверки, которые отсекают заведомо ошибочные данные:
Выясним причину, почему иногда алгоритм "не срабатывает". Чаще всего это происходит из-за неверного индекса в цикле или путаницы в коэффициентах (например, когда коэффициент для 11-го знака ошибочно применяют к 12-му). Используя наш пример с массивами, вы минимизируете риск таких ошибок.
Таким образом, мы рассмотрели полный цикл валидации ИНН: от понимания структуры номера до программной реализации в 1С. Этот алгоритм является стандартным и подходит для любых конфигураций на платформе 1С:Предприятие.