Продолжая тему расчёта контрольных сумм для регистрационных номеров, рассмотрим проверку номеров из органов статистики на примере ОКПО. Алгоритм проверки ОКПО и других номеров статистики довольно прост.
Как и в случае с другими номерами, последняя цифра в номере является контрольной. Алгоритм проверки ОКПО разбивается на несколько простых этапов:
- каждому разряду в номере до крайнего правого присваивается значение, соответствующее порядковому номеру. Если порядковый номер больше 10 - отсчёт снова начинается с начального значения;
- каждая цифра в номере перемножается с соответствующим коэффициентом;
- подсчитывается сумма;
- ищется остаток от деления на 11 - остаток должен быть равен последней цифре в номере.
В случае, когда остаток от деления равен 10, придётся проделать всё заново, но сдвинуть точку отсчёта порядковых номеров на 2. То есть у первого разряда коэффициент будет равен 3, у второго 4 и т.д., но при этом крайним значением также будет 10. Например, для номеров длиной в 10 символов будет ряд 3, 4, ... 10, 1, 2. Если после повторения всех операций со сдвигом остаток снова равен 10 - контрольное число сравнивают с нулём.
Хорошее описание алгоритма проверки ОКПО или проверки ОКАТО с примерами можно найти на
Википедии.
Алгоритм проверки ОКПО не сложен и в реализации. В качестве примера можно рассмотреть код на python:
def check_okpo(okpo):
def okpo_csum(stat_req, step=0):
pairs = [(i, int(x)) for i, x in (list(enumerate(stat_req[:10 - step], 1 + step)) + list(enumerate(stat_req[10 - step:], 1)))]
return sum([k * v for k, v in pairs[:-1]])
cval = okpo_csum(okpo) % 11
if cval == 10:
cval = okpo_csum(okpo, step=2) % 11
if cval == 10:
cval = 0
return cval == int(okpo[-1])
Во внутренней функции okpo_csum() подсчитывается контрольное число. В переменной k хранится список используемых коэффициентов. Вторая часть с разностью нужна для случаев, когда длина номера превышает 10 символов). Переменная step отражает сдвиг для коэффициентов.
Важно отметить, что в случае с ОКПО номер для ЮЛ должен состоять из 8 цифр, а для ИП из 10. Поэтому перед проверкой номера не забывайте добавлять лидирующие нули. Например, ОКПО ИП - 148543122, а для проверки номера нужно передавать 0148543122.
Алгоритм проверки ОКПО так же прост, как и
проверка ИНН или
проверка ОГРН. Стоит так же учесть, что подобным образом проверяется не только ОКПО, но и другие коды статистики.