При внедрении дисконтных или бонусных программ в розничной торговле перед разработчиками и аналитиками встает вопрос формирования структуры номеров и штрихкодов дисконтных карт. С одной стороны, простая последовательная нумерация удобна для эмиссии, с другой — порождает опасения относительно легкого подбора номеров и несанкционированного предоставления скидок. Разберем основные подходы к нумерации, особенности форматов штрихкодов, а также действенные методы защиты от махинаций как со стороны покупателей, так и со стороны кассиров.
Подходы к формированию номеров карт лояльности
Рассмотрим два основных варианта генерации номерной емкости карт:
Последовательная нумерация с контрольным символом. Номера формируются по порядку (например, от 000001 до 099999), к которым добавляется расчетная контрольная цифра. Это классический вариант, простой в учете и передаче макетов в типографию. Подбор такого номера теоретически возможен, однако в типовых розничных точках риск минимален, если размер скидки небольшой, а карта не дает эксклюзивных VIP-привилегий.
Случайная (псевдослучайная) генерация или кодирование с солью. Номер карты формируется на основе генератора случайных чисел с проверкой на уникальность в базе либо путем комбинирования даты эмиссии, префикса партии и хеш-алгоритма. Такой подход полностью исключает подбор соседнего валидного номера по известной карте.
Особенности стандартов кодирования: EAN-13 против Code 128
Проанализируем технические ограничения форматов штрихкодирования, которые используются для печати на пластиковых или картонных картах:
Формат EAN-13. При использовании стандарта EAN-13 необходимо использовать внутренние префиксы предприятия (диапазоны 20–29 или 99), чтобы исключить пересечение со стандартными штрихкодами штучных и весовых товаров GS1. Важно учитывать, что полезная длина EAN-13 ограничена: префикс занимает 2 цифры, а 13-й разряд является контрольной суммой по алгоритму Modulo 10. На сам номер карты остается всего 9–10 знаков, что сужает возможности создания сложных разреженных псевдослучайных последовательностей.
Формат Code 128 / Code 39. Если сканирующее оборудование настроено на считывание одномерных буквенно-цифровых кодов, предпочтительнее использовать Code 128. Он позволяет кодировать длинные случайные строки, буквенные префиксы серий и внутренние контрольные суммы без жестких ограничений стандарта EAN.
Двумерные коды (QR-код, DataMatrix). Применяются при интеграции с мобильными приложениями, позволяют зашивать динамические токены или криптографические подписи.
Защита от сговора кассиров и подделки штрихкодов
Печатный штрихкод на пластике легко скопировать (сфотографировать на смартфон или распечатать копию). Основные потери бизнес несет не от случайных покупателей, а от злоупотреблений персонала, когда кассир применяет карту с максимальной скидкой на чеки посторонних покупателей и присваивает разницу. Разберем комплексные методы защиты, которые можно реализовать в программе:
Запрет ручного ввода номера карты в РМК. В настройках прав кассира и профилей рабочего места кассира (РМК) в конфигурациях «1С:Розница» или «1С:Управление торговлей» обязательно отключаем возможность ручного набора номера карты с клавиатуры. Чтение должно происходить строго через подключенный сканер штрихкодов или ридер магнитных карт.
Подтверждение через SMS или PUSH-код. Разделяем логику начисления и списания: для начисления бонусов достаточно отсканировать карту или назвать номер телефона, а для предоставления крупной скидки или списания бонусов кассовая программа запрашивает одноразовый проверочный код, отправленный владельцу карты.
Тайм-аут на повторное использование карты. Программное ограничение на стороне 1С, запрещающее повторное применение одной и той же карты на кассе чаще одного раза в заданный интервал (например, раз в 15–30 минут). Это делает невозможным проведение потока покупателей подряд по одной «кассирской» скидке.
Аналитические отчеты по аномалиям продаж. Настраиваем периодический контроль чеков: выборка карт с аномально высокой частотой покупок в течение дня, сопоставление времени сканирования с записями систем видеонаблюдения.
Пример формирования последовательного штрихкода с контрольной цифрой EAN-13
Рассмотрим типовую функцию на встроенном языке 1С, которая формирует 13-значный штрихкод с внутренним префиксом и корректным расчетом контрольного символа по стандарту EAN-13:
Функция СформироватьШтрихкодEAN13(Префикс, НомерКарты)
// Префикс - строка из 2 цифр (например, "24")
// НомерКарты - число или строка до 10 знаков
СтрНомера = Формат(Число(НомерКарты), "ЧЦ=10; ЧВН=; ЧГ=0");
БазовыйКод = Префикс + СтрНомера; // Получаем 12 знаков
ЧетнаяСумма = 0;
НечетнаяСумма = 0;
Для Индекс = 1 По 12 Цикл
Цифра = Число(Сред(БазовыйКод, Индекс, 1));
Если Индекс % 2 = 0 Тогда
ЧетнаяСумма = ЧетнаяСумма + Цифра;
Иначе
НечетнаяСумма = НечетнаяСумма + Цифра;
КонецЕсли;
КонецЦикла;
ИтоговаяСумма = НечетнаяСумма + (ЧетнаяСумма * 3);
Остаток = ИтоговаяСумма % 10;
КонтрольнаяЦифра = ?(Остаток = 0, 0, 10 - Остаток);
Возврат БазовыйКод + Формат(КонтрольнаяЦифра, "ЧГ=0");
КонецФункции
Выводы
Для стандартных дисконтных систем с небольшим процентом скидки достаточно использовать последовательную нумерацию с префиксом предприятия и контрольной цифрой EAN-13. Если карта предоставляет значительную выгоду или позволяет списывать баллы, безопасность должна обеспечиваться не усложнением структуры штрихкода, а системными ограничениями в 1С: отключением ручного ввода на кассе, двухфакторным подтверждением операций и мониторингом подозрительной активности.