Матеріали

Тип документа іноді важливіший за сам номер

Чому для надійної ідентифікації в обміні даними замало номера документа і що додати в обмін, щоб збіг номерів не став помилкою у виплаті чи звіті.

3 хв читанняСергій Бєляков

Коли в обміні між двома системами передається лише номер документа, одна й та сама послідовність цифр може належати різним документам різних людей. Система бачить збіг і зіставляє записи. Помилка виглядає як успіх.

Умовний приклад збігу

Два реєстри обмінюються даними, ключ для зіставлення: номер документа. Записи нижче вигадані, але ситуація типова:

Реєстр Людина Що в полі «номер» Який це документ насправді
А Дитина, 2015 р. н. 123456 свідоцтво про народження, серія в іншому полі
Б Дорослий, 1971 р. н. 123456 паспорт-книжечка, серія в іншому полі

Обидва записи коректні. Але якщо зіставляти лише за номером, дитина з реєстру А «знайдеться» в реєстрі Б. Далі все залежить від того, що робить система зі збігом: підтягує адресу, перевіряє право на допомогу, рахує унікальних отримувачів.

Номер без типу: будинок без вулиці

Номер документа схожий на номер будинку. Будинок 12 є майже на кожній вулиці, і без назви вулиці лист не дійде за адресою. Тип документа і серія тут працюють як вулиця.

Аналогія неідеальна: у місті хоча б назви вулиць не повторюються. А серії і номери різних типів документів інколи перетинаються, тож навіть «вулиця» потребує уточнення, яка саме.

Звідки беруться хибні збіги

Збіг номерів рідко буває рідкісною випадковістю. Зазвичай за ним стоїть одна з чотирьох причин:

  • Різні нумерації. У кожного типу документа своя нумерація, і шість цифр легко повторюються між типами.
  • Серія в іншому полі. Номер передали, серію ні, або серію записали в окреме поле, яке не бере участі в зіставленні.
  • Втрачені нулі. Номер зберегли як число, і 012345 перетворився на 12345, тобто на зовсім інший номер.
  • Схожі літери. Латинські A, B, K виглядають як кириличні А, В, К, але для системи це різні символи.

Перші дві причини дають хибні збіги, дві останні хибні розбіжності: та сама людина в двох реєстрах не знаходиться. В обох випадках звіт рахує не те.

Які поля додати в обмін

Номер стає надійним ключем лише разом з кількома полями поруч:

  1. Тип документа як код з довідника, а не текст, який кожен пише по-своєму.
  2. Серія окремим полем, якщо вона є в цього типу документа.
  3. Номер як рядок, без пробілів і без перетворення на число.
  4. Дата видачі як додаткова перевірка, коли номери все ж збігаються.
  5. Країна видачі для іноземних документів.

Ключ для зіставлення тоді виглядає так: тип, серія і номер разом, після нормалізації (прибрати пробіли, звести латиницю і кирилицю до одного алфавіту за погодженим правилом).

Перевірка формату за типом

Перевірка «поле не порожнє» не бачить різниці між номером ID-картки і датою, вписаною не в те поле. Правила формату мають залежати від типу документа. Спрощений приклад для українських документів:

Тип документа Правило формату (спрощено)
Паспорт у формі ID-картки 9 цифр
Паспорт-книжечка 2 літери кирилиці і 6 цифр
Свідоцтво про народження серія і 6 цифр
Іноземний документ обов'язкова країна видачі

Такі правила варто запускати двічі: під час введення даних і під час отримання їх в обміні. Запис, що не пройшов перевірку, має повертатися відправнику з причиною, а не зникати мовчки або потрапляти в реєстр «як є».

Чому це питання архітектури, а не дрібниця інтерфейсу

Легко вирішити, що це деталь конкретного API чи SOAP-сервісу і її поправлять програмісти. Насправді це питання контракту обміну: які поля обов'язкові, з якого довідника береться тип, хто перевіряє формат.

Якщо в контракті є одне поле «номер документа», кожна система-отримувач угадує тип по-своєму. Хтось за довжиною, хтось за наявністю літер, хтось взагалі не вгадує. Виправляти це в кожному звіті окремо дорого і ненадійно. Виправляти в контракті один раз дешевше, навіть якщо доведеться погоджувати зміну з кількома сторонами.

Що зробити на практиці

  1. Відкрийте опис обміну і перевірте, чи передається тип документа окремим полем.
  2. Якщо ні, додайте тип з довідника і серію окремо від номера.
  3. Опишіть правила формату для кожного типу і запустіть їх на введенні та на отриманні.
  4. Зіставте два реєстри двічі: лише за номером і за повним ключем. Різниця між результатами покаже кількість хибних збігів.

Останній крок займає пів години, а дає аргумент, який легко показати керівництву: скільки записів зараз зіставляються помилково. Саме з таких аргументів починається розмова про архітектуру даних.

А як у вас: обмін передає тип документа окремим полем чи система все ще вгадує його за довжиною номера?

Схожа задача у вашій команді?

Опишіть ситуацію кількома реченнями. Відповім, з чого я б почав і чи можу допомогти.

Обговорити задачу

Короткі розбори про дані щотижня в Telegram-каналі: @belyakovconsult

Усі матеріали