Номера паспортов и документов

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

Принципы построения масок для документов

Маска в Inputmask представляет собой строку или объект, описывающий допустимую структуру ввода. Для документных номеров ключевыми становятся следующие элементы:

  • 9 — обязательная цифра
  • a — обязательная буква
  • * — любая буква или цифра
  • [] — необязательные блоки
  • литералы — фиксированные символы (пробелы, дефисы, точки)

Для паспортных и идентификационных данных чаще всего используется строго цифровая маска с фиксированным количеством символов и визуальным разделением.

Дополнительные параметры, влияющие на поведение:

  • placeholder — отображаемый шаблон
  • showMaskOnHover — отображение маски при наведении
  • clearIncomplete — очистка незавершённого ввода
  • autoUnmask — возврат «чистого» значения без форматирования

Паспорт гражданина РФ: структура и маска

Паспорт гражданина РФ имеет фиксированную структуру: серия и номер. Обычно формат записывается как:

XXXX XXXXXX, где

  • первые 4 цифры — серия
  • последние 6 цифр — номер документа

Для Inputmask это выражается следующим образом:

Inputmask("9999 999999").mask("#passport");

Такой вариант обеспечивает:

  • автоматическое разделение серии и номера пробелом
  • запрет любых символов кроме цифр
  • строгую длину ввода

При необходимости можно усилить контроль:

Inputmask({
  mask: "9999 999999",
  placeholder: "____ ______",
  clearIncomplete: true
}).mask("#passport");

Здесь незавершённые значения будут автоматически очищаться при потере фокуса, что полезно для форм регистрации и KYC-процессов.

Альтернативные документные форматы

Помимо паспорта РФ, Inputmask часто применяется для других документов с фиксированной структурой.

Идентификационный номер (ИИН / ITN)

Во многих странах используется 12-значный идентификатор:

Inputmask("999999999999").mask("#iin");

При необходимости визуального разделения:

Inputmask("999 999 999 999").mask("#iin");

Заграничный паспорт

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

Inputmask("AA9999999").mask("#foreignPassport");

или более универсальный вариант:

Inputmask("**9999999").mask("#foreignPassport");

Где * допускает и буквы, и цифры, что удобно для международных форматов.

Водительское удостоверение

Форматы водительских удостоверений часто варьируются, но могут быть представлены как комбинации цифр с фиксированными блоками:

Inputmask("9999-999999-99").mask("#driverLicense");

Такой подход обеспечивает:

  • визуальное разделение блоков
  • уменьшение ошибок ввода
  • унифицированный формат хранения

Использование кастомных определений символов

Inputmask позволяет расширять стандартные маски через definitions, что особенно полезно для документов с нестандартной структурой.

Пример определения собственной маски для буквенно-цифрового символа:

Inputmask({
  mask: "aa-9999-****",
  definitions: {
    "a": {
      validator: "[A-Za-z]",
      cardinality: 1
    }
  }
}).mask("#customDoc");

В этом примере:

  • a строго ограничен латинскими буквами
  • 9 — цифры
  • * — любые символы

Подобный подход позволяет адаптировать библиотеку под любые национальные или корпоративные стандарты документов.

Регулярные выражения против масок

В Inputmask можно использовать регулярные выражения, если структура документа слишком сложна для классической маски.

Пример для паспорта с дополнительной проверкой диапазона символов:

Inputmask({
  mask: /^\d{4}\s?\d{6}$/,
  placeholder: ""
}).mask("#passport");

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

Динамическое поведение масок

Документы могут иметь несколько допустимых форматов в зависимости от страны или типа пользователя. В таких случаях применяется динамическая смена маски:

const maskPassportRU = "9999 999999";
const maskPassportIntl = "***********";

Inputmask({
  mask: [maskPassportRU, maskPassportIntl],
  keepStatic: true
}).mask("#passport");

Параметр keepStatic управляет тем, как Inputmask переключается между вариантами.

Работа с незавершёнными значениями

Документные поля часто требуют строгой валидации при потере фокуса. Ключевые параметры:

Inputmask({
  mask: "9999 999999",
  clearIncomplete: true,
  showMaskOnHover: false,
  showMaskOnFocus: true
}).mask("#passport");

Поведение:

  • при фокусе показывается шаблон
  • при потере фокуса незавершённые значения удаляются
  • пользователь не может оставить частично заполненное поле

Автоудаление маски и хранение «чистого» значения

При отправке формы часто требуется получить только цифры без форматирования:

Inputmask({
  mask: "9999 999999",
  autoUnmask: true
}).mask("#passport");

В результате значение:

1234 567890

будет преобразовано в:

1234567890

Это критично для серверной обработки, где форматирование не должно влиять на хранение данных.

Проверка корректности ввода на уровне событий

Inputmask предоставляет события, которые позволяют отслеживать состояние поля:

$("#passport").inputmask({
  mask: "9999 999999"
}).on("complete", function () {
  console.log("Поле заполнено полностью");
}).on("incomplete", function () {
  console.log("Поле заполнено частично");
});

Основные события:

  • complete — ввод завершён
  • incomplete — введено не полностью
  • cleared — поле очищено

Такая логика часто используется для активации кнопок отправки формы.

Маски для многоформатных документов

В некоторых системах один и тот же тип поля может принимать разные форматы документов. Например:

Inputmask({
  mask: ["9999 999999", "99 99 999999"],
  keepStatic: true
}).mask("#document");

Это полезно при миграции систем или поддержке разных стандартов.

Частые ошибки при проектировании масок документов

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

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

Правильная настройка Inputmask в контексте документов всегда должна разделять:

  • отображаемый формат ввода
  • внутреннее значение
  • правила валидации и завершённости ввода