Телефонный префикс и город в документации часто выглядят связанными, но на практике эта связь гораздо слабее, чем кажется. Разработчик, который требует, чтобы номер и адрес принадлежали одной местности, рискует отклонять корректные данные. Разберём, из чего состоит международный номер, почему код не всегда указывает на местность и как обращаться с этой связкой в тестовых данных.
Из чего состоит международный номер
Международная запись номера начинается с кода страны. Его длина не фиксирована: он может занимать одну, две или три цифры, поэтому по началу строки нельзя однозначно сказать, где заканчивается код страны и начинается остальная часть.
Дальше идёт национальный номер. Его длина определяется правилами самой страны, и общего значения, одинакового для всех, не существует — есть лишь техническое ограничение на общую длину записи.
Единого способа расставить разделители тоже нет. Одна страна группирует цифры по три, другая — по два и три, третья не разделяет вовсе. Для хранения это означает простую вещь: разделители относятся к оформлению, а не к данным, и в базе номер логичнее держать одной последовательностью цифр вместе с кодом страны.
Отдельная тонкость — как записывать номер в базе. Разделители, скобки и пробелы удобны для чтения, но мешают сравнению: один и тот же номер, записанный двумя способами, превращается в два разных значения. Хранение в виде последовательности цифр вместе с кодом страны, а разделители только при выводе, снимает целый класс ошибок поиска и сопоставления записей.
Что означает код города?
Внутри национального номера часто есть часть, исторически закреплённая за местностью. Именно её в быту называют кодом города, и именно из неё пытаются вывести город абонента.
Пока номер принадлежал одному оператору и одному городу, такой вывод работал. Сегодня условий стало больше, и связь ослабла по нескольким причинам сразу.
Первая: номера переносятся между операторами. Человек меняет оператора, сохраняя номер, и вместе с ним переходит в другую сеть, а иногда и в другой регион.
Вторая: у мобильных номеров привязка к местности изначально условная. Диапазон выделяется оператору, а не городу, и человек с таким номером может находиться где угодно.
Может ли префикс указать, где находится абонент?
Нет, и на это есть несколько независимых причин. Даже если код когда-то был закреплён за местностью, он говорит о происхождении диапазона, а не о текущем положении человека.
К этому добавляется то, что номер вообще не связан с адресом. Адрес регистрации, адрес доставки и место, откуда звонят, — три разные вещи, которые совпадают далеко не всегда.
Практический вывод: по номеру нельзя утверждать, что абонент находится в городе из адреса, и уж точно нельзя на этом основании блокировать заказ. Как максимум это повод показать мягкое предупреждение.
Надёжность разных выводов удобно сравнить в таблице.
| Что сравниваем | Насколько надёжен вывод |
|---|---|
| Код страны и адрес | надёжно: номер принадлежит этой стране |
| Длина номера и правила страны | надёжно в пределах известных правил |
| Код города и город в адресе | ненадёжно: номер мог переехать вместе с человеком |
| Диапазон и оператор | устаревает быстро и незаметно |
Из таблицы видно, где проверка уместна, а где она лишь создаёт видимость контроля.
Как проверять согласованность в тестовых данных
В тестовых наборах связка «номер и город» полезна не как правило, а как проверка самой системы. Если данные собираются автоматически, стоит убедиться, что номер не остался от другого адреса — например, при копировании записи.
Правильная реакция на расхождение — пометка, а не отказ. Так тест проверяет, что система замечает несоответствие, но не мешает оформить заказ человеку, который просто переехал или сохранил старый номер.
Полезно держать в наборе несколько примеров: номер, совпадающий с городом, номер из другого региона и мобильный номер, для которого вопрос о городе вообще не имеет смысла. Третий случай чаще всего и ломает слишком строгую проверку. Как устроены такие наборы целиком, разобрано в статье про адресные данные в тестовых наборах.
Чем мобильный номер отличается от городского
Разница между городским и мобильным номером глубже, чем кажется: именно она объясняет, откуда вообще взялась идея о связи номера с городом.
Городской номер исторически был привязан к месту: линия физически приходила в конкретный дом, поэтому часть номера обозначала район, а иногда и более мелкую зону внутри него. Пока эта связь была физической, вывод о городе работал.
Мобильные номера устроены иначе. Диапазоны выделяются операторам, а оператор обслуживает всю страну, поэтому привязка к городу у мобильного номера изначально условна. Даже если когда-то она совпадала с местом выдачи, сегодня ничто не мешает человеку пользоваться номером в другом регионе.
Добавим переносимость номеров: абонент сохраняет номер при смене оператора, и сведения о том, какая сеть его обслуживает, устаревают так же быстро, как меняются условия связи. Для систем это означает, что любые внешние справочники по диапазонам теряют актуальность незаметно.
Есть и совсем негеографичные номера: служебные, виртуальные, номера для переадресации. У них привязки к местности нет и не было, поэтому попытка вывести по такому номеру город не просто неточна, а бессмысленна.
Ни один из этих случаев не мешает использовать номер как контакт: он остаётся уникальным и рабочим. Меняется только одно — из него нельзя вывести, где человек находится, а значит, его нельзя использовать как доказательство в проверках.
Что важно разработчику
Первое: выберите единый формат хранения. Код страны и национальный номер в отдельных полях, только цифры, без пробелов и скобок — тогда сравнение и поиск дублей работают предсказуемо, а оформление остаётся задачей интерфейса.
Второе: решите, чем является проверка согласованности. Если это предупреждение, его нужно уметь отключить или проигнорировать; если жёсткое правило, оно рано или поздно отклонит корректный номер.
Третье: не выводите из номера факты о человеке. Город по коду, оператор по диапазону, регион по префиксу — всё это догадки разной степени надёжности, и в интерфейсе они не должны выглядеть как данные.
Четвёртое: помните, что номер живёт в форме рядом с адресом, поэтому проверять их стоит вместе. Как выглядит такая форма на данных разных стран, видно на примере США, а общий разбор полей — в материале о проверке и нормализации.
Место для такой проверки — отчёт о качестве данных, а не путь оформления заказа. Если система замечает, что номер и город не совпадают, полезно записать это в журнал или показать в отчёте, но не мешать человеку завершить действие. Иначе получается правило, которое нельзя ни доказать, ни отключить.
Если номер всё же нужно сопоставлять с адресом, лучше делать это один раз при вводе и сохранять результат отдельно, чем пересчитывать при каждом чтении. Пересчёт по актуальным справочникам через год даст другой ответ, и одна и та же запись начнёт выглядеть по-разному в зависимости от даты отчёта. Для такой догадки стабильность важнее точности, которой у неё всё равно нет. Полезно и подписывать результат: не «город клиента», а «город, определённый по номеру», — тогда к значению будут относиться соответственно.
И о происхождении данных: номера и адреса из генератора вымышлены. Они предназначены только для тестирования программ, по ним нельзя ничего отправить, и они не подтверждают ни личность, ни место жительства.
Что делать дальше
Возьмите номер из генератора и подставьте его в форму вместе с адресом из другой страны: посмотрите, что именно скажет система — предупреждение или отказ. Если отказ, проверку стоит ослабить: связь между номером и городом слишком слаба, чтобы на ней что-то запрещать.