При автоматизации учета алкогольной продукции на складах и в производстве специалисты часто сталкиваются с аппаратными сбоями при сканировании штрихкодов акцизных марок нового образца. Плотный двухмерный код DataMatrix, содержащий идентификатор ЕГАИС длиной 150 символов, предъявляет повышенные требования к качеству и скорости передачи данных. В процессе работы сканер может «сбоить», подменяя часть символов длинными цепочками одинаковых знаков (например, IIIIIIIIII или 7777777777). Поиск ошибочно отсканированной бутылки на складе превращается в трудоемкую задачу.
В этой статье мы подробно проанализируем причины возникновения подобных сбоев, выясним, почему невозможно рассчитать контрольную сумму марки простым математическим алгоритмом, и рассмотрим эффективные аппаратные и программные методы решения этой проблемы.
Прежде чем переходить к устранению ошибок, разберем структуру штрихкода ЕГАИС, содержащегося на федеральных специальных и акцизных марках. Данный штрихкод имеет строго фиксированную длину — 150 символов. Он состоит из следующих сегментов:
Важно понимать природу последних 129 символов. Многие разработчики пытаются найти простой локальный алгоритм (например, CRC, XOR или формулу Луна) для расчета контрольной суммы, чтобы проверять правильность считывания марки на лету. Однако этот блок представляет собой криптографическую электронную цифровую подпись (ЭЦП), созданную средствами криптографической защиты информации (СКЗИ) по государственным стандартам ГОСТ Р 34.10-2001 или ГОСТ Р 34.10-2012.
Поскольку подпись генерируется АО «Гознак» с использованием закрытого секретного ключа, выполнить её полноценную математическую проверку локально (без использования закрытых государственных сертификатов ЕГАИС или онлайн-запросов к УТМ) невозможно. Тем не менее, мы можем реализовать надежную эвристическую проверку штрихкода на программном уровне 1С, предварительно устранив аппаратные причины сбоев.
Рассмотрим ситуацию: сканер успешно считывает код, издает звуковой сигнал (подтверждающий корректное распознавание внутренней структуры кода DataMatrix и его контрольных сумм по алгоритму Рида-Соломона), но в программу 1С прилетает строка с искажениями. Например:
147400039709601018001IIQYU3TLNRQZM2HVQZMBLDRZZUYFHOTECWJLENZGTKYB4XKZ5Q7B3KVHFEWHX5I4MNDQXOMBEXOUFPEU57AWV4V2WNKA26T6W6FIIIIIIIIIIIIIIIII6XXWH4576TCZE
В середине этой строки четко видна непрерывная последовательность символов IIIIIIIIIIIIIIIII. Это классическое проявление проблемы передачи данных, а не сбоя самого оптического модуля сканера.
Большинство сканеров штрихкода по умолчанию работают в режиме USB-HID (эмуляция клавиатуры). При сканировании прибор начинает имитировать высокоскоростной ввод символов с клавиатуры в активное окно операционной системы. Когда в систему передается длинная строка из 150 символов, возникает аппаратная перегрузка клавиатурного буфера. Это может быть вызвано:
Самым надежным способом устранения «залипаний» и искажений символов является перевод сканера из режима клавиатуры в режим Virtual COM Port (V-COM). В этом режиме данные передаются напрямую в порт ввода-вывода операционной системы в виде единого массива байтов, полностью минуя клавиатурный буфер Windows.
Для реализации этого решения выполним следующие шаги:
COM3.COM3. Теперь данные будут попадать в 1С мгновенно и без малейших искажений, независимо от раскладки клавиатуры и загрузки процессора.Если специфика вашего программного обеспечения или архитектуры ИТ-системы не позволяет использовать виртуальный COM-порт, проблему можно решить оптимизацией клавиатурного режима передачи данных.
Для этого в сервисной инструкции к сканеру необходимо найти раздел настройки задержки между символами (Inter-character Delay / Inter-message Delay). По умолчанию эта задержка равна нулю, то есть сканер выплевывает данные с максимально возможной скоростью. Нам необходимо установить задержку в диапазоне от 10 до 25 миллисекунд.
Да, процесс передачи кода в 150 символов замедлится примерно на 1.5–3 секунды, и визуально будет заметно, как символы «печатаются» на экране. Однако это полностью разгрузит клавиатурный контроллер операционной системы и исключит появление дублирующихся фантомных символов.
Если в офисном помещении сканер работает корректно, а при переносе на склад или в цех розлива алкогольной продукции начинает искажать штрихкоды, причина кроется в электромагнитных наводках.
Проанализируем электромагнитную обстановку на рабочем месте:
Чтобы окончательно застраховать бизнес-процессы от попадания некорректно считанных кодов в учетную систему, разработаем алгоритм программной проверки на уровне 1С. Поскольку мы не можем проверить криптографическую подпись без связи с ЕГАИС, мы применим эвристические методы проверки структуры строки.
Создадим функцию проверки, которая будет анализировать отсканированный штрихкод по следующим критически важным критериям:
IIIII) с вероятностью 99.9% свидетельствует об аппаратном сбое передачи.Рассмотрим пример реализации такой проверки на встроенном языке 1С:
&НаКлиенте
Функция КодМаркиЕГАИСКорректен(Знач Штрихкод) Экспорт
// Очистим пробельные символы по краям
Штрихкод = СокрЛП(Штрихкод);
// 1. Проверяем жесткое требование к длине кода
Если СтрДлина(Штрихкод) <> 150 Тогда
Возврат Ложь;
КонецЕсли;
// 2. Проверяем допустимый алфавит (только цифры и заглавная латиница)
ДопустимыеСимволы = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Для Позиция = 1 По 150 Цикл
Символ = Сред(Штрихкод, Позиция, 1);
Если Найти(ДопустимыеСимволы, Символ) = 0 Тогда
// Обнаружен спецсимвол, русская буква или строчный символ
Возврат Ложь;
КонецЕсли;
КонецЦикла;
// 3. Эвристический анализ на "залипание" (дублирование символов из-за сбоя клавиатуры)
// В настоящем криптографическом коде длинные цепочки повторов статистически невозможны
МаксимальноДопустимыйПовтор = 4;
ТекущийСимвол = "";
СчетчикПовторов = 1;
Для Позиция = 1 По 150 Цикл
Символ = Сред(Штрихкод, Позиция, 1);
Если Символ = ТекущийСимвол Тогда
СчетчикПовторов = СчетчикПовторов + 1;
Если СчетчикПовторов > МаксимальноДопустимыйПовтор Тогда
// Обнаружен аппаратный сбой передачи символов сканером
Возврат Ложь;
КонецЕсли;
Иначе
ТекущийСимвол = Символ;
СчетчикПовторов = 1;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Эту функцию рекомендуется вызывать непосредственно в обработчике события сканирования штрихкода формы (например, ВводДоступен или при получении данных от драйвера торгового оборудования). Если функция возвращает Ложь, система должна заблокировать проведение документа, издать предупреждающий звуковой сигнал и вывести на экран сообщение: «Ошибка сканирования! Пожалуйста, повторите сканирование марки медленно или переведите сканер в COM-режим».
Для окончательной проверки подлинности считанных кодов, если марка уже прошла локальный фильтр в 1С, используются штатные сервисы контроля:
Комбинация аппаратной настройки сканеров (перевод в COM-порт или внедрение задержки ввода) с программным фильтром на стороне 1С позволяет полностью исключить человеческий фактор и предотвратить путаницу при учете алкогольной продукции на предприятии.