При разработке мобильных приложений на платформе 1С программисты часто сталкиваются с тем, что стандартные средства работы с мультимедиа отлично справляются с обычными кодами EAN-13, но полностью игнорируют дополнительные блоки цифр. Формат EAN-13+5 (Addon 5) широко применяется в торговле периодическими изданиями, книгами (код ISBN) и специфическим весовым товаром. Проблема заключается в том, что мобильная платформа 1С при использовании встроенных механизмов считывает только основную тринадцатизначную часть штрихкода.
В этой статье мы подробно разберем, почему стандартный метод дает сбой, и рассмотрим альтернативные пути решения этой задачи, включая использование внешних приложений и настройку специализированного оборудования.
Рассмотрим стандартный подход, который обычно применяется в мобильной разработке. Для вызова сканера используется метод СредстваМультимедиа.ПоказатьСканированиеШтрихКодов. На первый взгляд, код выглядит просто и логично:
&НаКлиенте
Процедура СканированиеШК(Команда)
Оповещение = Новый ОписаниеОповещения("ШКПриИзменении", ЭтотОбъект);
СредстваМультимедиа.ПоказатьСканированиеШтрихКодов("Считайте штрихкод", Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ШКПриИзменении(ШтрихКод, Результат, Сообщение, ДополнительныеПараметры) Экспорт
Если Результат Тогда
Сообщить("Считан ШК: " + ШтрихКод);
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию: при использовании этого кода на смартфоне с установленной мобильной платформой (например, версии 8.3.12 и выше), камера успешно фокусируется на коде EAN-13+5, но в переменную ШтрихКод попадают только первые 13 цифр. Пятизначное дополнение (Add-on) отбрасывается библиотекой обработки изображений. Выясним причину: встроенные алгоритмы 1С базируются на упрощенных конфигурациях библиотек (таких как ZXing), где поддержка дополнений отключена для повышения скорости и стабильности распознавания основных кодов. В текущих реализациях платформы 1С нет штатного флага, который позволил бы принудительно включить чтение EAN-5 Add-on.
Разберем более продвинутый метод, который позволяет обойти ограничения платформы. В операционной системе Android приложения могут взаимодействовать друг с другом через механизм Intent. Если штатный сканер не справляется, мы можем вызвать профессиональное стороннее приложение, которое поддерживает расширенные форматы.
Для реализации этого метода нам понадобится функция ЗапускПриложенияМобильногоУстройства. Рассмотрим пример вызова популярного сканера, поддерживающего передачу результата обратно в 1С:
&НаКлиенте
Процедура СканироватьВнешнимПриложением()
ПараметрыЗапуска = Новый ЗапускПриложенияМобильногоУстройства("com.google.zxing.client.android.SCAN");
// Указываем режим сканирования (опционально)
ПараметрыЗапуска.ДополнительныеДанные.Вставить("SCAN_MODE", "PRODUCT_MODE");
// Вызываем приложение и ждем результат
ЗапускПриложенияМобильногоУстройства.Запустить(ПараметрыЗапуска, Новый ОписаниеОповещения("ПослеСканирования", ЭтотОбъект));
КонецПроцедуры
&НаКлиенте
Процедура ПослеСканирования(КодВозврата, ДополнительныеДанные, Параметры) Экспорт
Если КодВозврата = -1 Тогда // Success
ШтрихКод = ДополнительныеДанные.Получить("SCAN_RESULT");
Сообщить("Полный код (с аддоном): " + ШтрихКод);
КонецЕсли;
КонецПроцедуры
Важный момент: Чтобы этот метод сработал, в настройках самого стороннего приложения (например, ZXing Barcode Scanner) должна быть активирована опция "Считывать дополнения EAN". В некоторых случаях сторонние приложения возвращают основной код и аддон в разных ключах ДополнительныеДанные, поэтому рекомендуем проанализировать всё содержимое соответствия, приходящего в обработчик оповещения.
Если прямой вызов через Intent кажется сложным или конкретное приложение-сканер его не поддерживает, проанализируем вариант с эмуляцией клавиатуры. Существуют специализированные приложения (например, Barcode Keyboard), которые работают в фоне.
Алгоритм работы в этом случае следующий:
Строка.Этот метод наиболее универсален, так как для 1С это выглядит как обычный ввод текста, и программисту не нужно писать сложный код обработки внешних событий. Достаточно прописать логику в событии ПриИзменении текстового поля.
Посмотрим на ситуацию, когда разработка ведется не для обычного смартфона, а для защищенного ТСД со встроенным лазерным или имидж-сканером. На таких устройствах сканирование управляется системной службой (например, DataWedge на Zebra или аналоги у Honeywell, Urovo).
Разберем шаги по настройке на примере Zebra:
Broadcast Intent.После этих манипуляций встроенный сканер ТСД начнет передавать в 1С полную строку. В коде 1С это будет обрабатываться через процедуру ВнешнееСобытие:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Событие = "Barcode" Тогда
Сообщить("Считан штрихкод с ТСД: " + Данные);
КонецЕсли;
КонецПроцедуры
Проанализируем техническую составляющую штрихкода. Нужно понимать, что основной блок EAN-13 и блок Addon 5 — это фактически две разные графические зоны. Сканеру требуется время, чтобы "связать" их воедино. Если освещение недостаточное или камера смартфона имеет низкое разрешение, сканер может успеть распознать только левую часть (основную) и закрыть сессию сканирования до того, как распознает правую.
Советы для стабильного считывания:
EAN-13+5 она должна составлять 18 символов. Если пришло 13 — значит, сканер проигнорировал дополнение.Таким образом, мы выяснили, что штатная мобильная платформа 1С на данный момент имеет ограничения в работе с EAN13Addon5, но эта проблема успешно решается с помощью внешних инструментов или правильной настройки системных служб ТСД.