Меню

Проверка CPF CNPJ: два бразильских налоговых номера

Проверка CPF CNPJ опирается на взвешенную сумму с остатком от деления и двумя контрольными цифрами в конце. Разбираем, чем различаются номера физического и юридического лица, почему последовательности из одинаковых цифр исключают отдельно и почему совпавший формат ничего не говорит о регистрации.

Опубликовано

  • тестовые данные
  • налоговые номера
  • проверка номеров

Проверка CPF CNPJ интересна тем, что два разных по смыслу номера устроены по одной и той же идее, но с разными числами внутри. Ниже разберём, что это за два номера, чем они отличаются по структуре, как устроена их арифметика на уровне идеи, почему одинаковые цифры подряд требуют отдельного правила, где проходит граница между проверкой записи и проверкой статуса и что из этого следует для разработчика формы.

Что означают два бразильских налоговых номера?

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

Оба номера содержат контрольные цифры, и оба выдаются в рамках национальной системы регистрации налогоплательщиков. Именно поэтому их так часто упоминают рядом: у человека и у организации в одной и той же стране есть по собственной записи, и обе записи выглядят как числовая строка с проверяемым окончанием.

Практическое следствие для форм и интерфейсов вытекает сразу: это не один номер с двумя режимами, а два разных поля с разными правилами. Смешивать их в одном поле с общей проверкой — значит гарантированно получить путаницу, когда пользователь введёт не тот номер, а система не сможет объяснить, какой именно ей нужен.

Чем различаются эти два номера по устройству?

Оба номера построены по схеме «несколько знаков содержательной части плюс две контрольные цифры в конце». Количество знаков в содержательной части у них разное, и это первое, что бросается в глаза при сравнении.

Свойство Номер физического лица Номер юридического лица
За кем закрепляется за человеком за организацией
Сколько контрольных цифр две две
Как записывается обычно с разделителями для читаемости обычно с разделителями для читаемости
Форматы отображения различаются по документам различаются по документам
Что проверяет арифметика согласованность строки согласованность строки

Обратите внимание на предпоследнюю строку. Даже внешний вид записи одного и того же номера не является чем-то жёстко заданным: в разных документах и разных интерфейсах встречаются разные способы расставить точки, дефисы и косые черты. Это оформление, а не часть номера.

Отсюда первое практическое требование: перед любой проверкой удалите все разделители. Если этого не сделать, один и тот же номер, введённый двумя разными способами, будет выглядеть как два разных значения, и система начнёт считать их разными записями. В базах данных это приводит к дублям, которые потом очень трудно распутать.

Как устроена арифметика контрольных цифр?

На уровне идеи оба номера используют один и тот же приём, знакомый по множеству систем нумерации: знаки содержательной части умножаются на веса, произведения складываются, сумма делится с остатком, а из остатка получают значение контрольной цифры.

Две особенности отличают этот приём в применении к налоговым номерам. Первая — контрольных цифр две, и вторая вычисляется уже с учётом первой. Это значит, что проверка идёт последовательно: сначала согласуется первая цифра, затем вторая, и ошибка на первом шаге почти всегда тянет за собой несоответствие на втором. Для сообщений пользователю это важно: не стоит показывать две ошибки там, где на самом деле одна.

Вторая особенность — веса, которые меняются от позиции к позиции не самым тривиальным образом. Именно поэтому правило нельзя восстановить на глаз, глядя на несколько примеров: его берут из официального описания, а не выводят самостоятельно. Изобретать собственный вариант бессмысленно — он не совпадёт с тем, что применяют выдающие системы, и будет отвергать корректные номера.

Общая природа таких правил, включая их поведение при перестановке соседних знаков, разобрана в обзоре алгоритмов контрольной цифры. Здесь же достаточно понимать, что арифметика работает только с цифрами и только с очищенной строкой.

Почему одинаковые цифры подряд приходится исключать отдельно?

Если сложить несколько одинаковых чисел с любыми весами и поделить результат на модуль, остаток получится каким-то определённым — и для целого класса последовательностей этот остаток случайно совпадает с тем, который ожидается в последней позиции. Иными словами, арифметика сама по себе не мешает строке из одних нулей или из одних единиц пройти проверку.

Такие последовательности не выглядят как настоящие номера: никто не выдаёт подряд идущие одинаковые цифры в качестве реальной записи. Поэтому в официальных описаниях их выносят в отдельный список и требуют отвергать независимо от результата вычислений. Это правило не про арифметику, а про здравый смысл: строка, которую невозможно выдать, не должна считаться корректной только потому, что она согласована.

Для реализаций отсюда следует простой вывод: проверка не сводится к одной формуле. Кроме вычислений нужен список запрещённых видов строк, и он должен обновляться вместе с правилом, а не жить отдельно от него. Конкретные значения этого списка здесь не приводятся намеренно: их место — в официальном описании, а не в пересказе, а любые строки, показанные в примерах, придуманы для объяснения и не являются чьими-либо номерами.

Согласованность строки и статус регистрации — разные вещи

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

Между двумя утверждениями лежит целая пропасть. Первое — «строка составлена непротиворечиво» — проверяется локально, мгновенно и без обращения куда-либо. Второе — «эта запись существует в реестре, активна и принадлежит такому-то лицу» — требует обращения к системе, которая ведёт учёт, со всеми её ограничениями: доступом, задержками, отказами и правилами использования данных.

Для интерфейса из этого следует требование разделять три ответа, а не два. Формат совпал. Контрольные цифры сошлись. Регистрация подтверждена. Первые два вы получаете сами, третий — только из внешнего источника, и только если у вас есть право его запрашивать. Сообщение, которое сливает их в одно «номер действителен», вводит в заблуждение всех: и пользователя, и того, кто потом читает отчёт.

Что важно учесть в форме и в очистке данных

Первое — отдельные поля. Если форма обслуживает и людей, и организации, дайте каждому случаю своё поле и свой набор подсказок. Общее поле заставляет пользователя угадывать, какой номер от него ждут.

Второе — очистка до проверки и сохранение исходного вида. Разделители нужно убирать для сравнения, но не обязательно выбрасывать навсегда: пользователю полезно видеть строку в привычном ему виде, а системе — хранить канонический вариант. Нормализация, если её правильно понимать, описана в разборе устройства проверки номера.

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

Четвёртое — формулировки ошибок. Пользователю нужно различать «не тот тип номера», «лишний знак» и «контрольные цифры не сходятся», потому что действия во всех трёх случаях разные. Две разные контрольные цифры в одном сообщении лучше показывать как одну проблему: вторая почти всегда следствие первой.

Что делать дальше

Разведите два номера по разным полям и вынесите их правила в данные, а не в условные ветки внутри логики: тогда исправление или дополнение правил не будет требовать переписывания кода. Затем проверьте несколько заведомо вымышленных строк в инструменте проверки, чтобы убедиться, что ваш интерфейс объясняет результат теми же словами, что и он.

Все номера, упомянутые в этой статье и показанные в примерах, сконструированы исключительно для демонстрации хода проверки: они не соответствуют ни одному реальному человеку или предприятию, ничего не говорят о регистрационном статусе и не могут служить подтверждением существования записи в каком-либо реестре.

Читать дальше

Статьи: Проверка ИНН