Разработка для мобильных платформ в экосистеме 1С имеет свои особенности, особенно когда речь заходит о взаимодействии с аппаратными функциями или специфическими библиотеками. Одной из частых задач является генерация штрихкодов и QR-кодов непосредственно на мобильном устройстве без обращения к серверу или внешним API. В этой статье мы проанализируем ситуацию, разберем доступные методы и посмотрим на примеры кода, которые помогут вам внедрить этот функционал в свои мобильные приложения.
Самый правильный и поддерживаемый путь — использование типовых решений от фирмы 1С. В мобильной версии БПО (начиная с версий 2.10.8 и выше, а тем более в современной редакции 3.0) уже предусмотрены механизмы для работы со штрихкодами. Разберем, как это реализовано.
В составе БПО есть демонстрационная база, где представлена обработка Демо печать штрихкода. Она служит отличным примером для интеграции. Основная логика заключается в использовании внешней компоненты, которая поставляется вместе с библиотекой. Для работы с ней необходимо выполнить следующие шаги:
Важный момент: современные версии БПО объединяют хранилища для стационарных и мобильных платформ, что упрощает поддержку кода. В мобильном клиенте или мобильном приложении нативная компонента 1С для печати штрихкодов позволяет генерировать QR-коды, DataMatrix и стандартные линейные коды (EAN-13).
Если вы решили использовать компоненту отдельно от БПО или пишете собственное решение, нам потребуется механизм ПодключитьВнешнююКомпоненту. Рассмотрим пример кода, который инициализирует драйвер сканера и генератора:
// Устанавливаем компоненту из макета
РезультатУстановки = УстановитьВнешнююКомпоненту("ОбщийМакет.Драйвер1ССканерШтрихкода");
Если РезультатУстановки Тогда
// Формируем программный идентификатор
ИмяОбъекта = "MobileBarcodeScanner";
ПрогИД = "AddIn.MobileBarcodeScanner.MobileBarcodeScanner";
// Подключаем компоненту
ВнешняяКомпонентаПодключена = ПодключитьВнешнююКомпоненту("ОбщийМакет.Драйвер1ССканерШтрихкода", "MobileBarcodeScanner", ТипВнешнейКомпоненты.Native);
Если ВнешняяКомпонентаПодключена Тогда
Попытка
ГенераторQRКода = Новый (ПрогИД);
// Параметры: Текст, Уровень коррекции (0-3), Размер картинки
ДвоичныеДанныеКартинки = ГенераторQRКода.GenerateQRCode("https://1c.ru", 0, 300);
Если ДвоичныеДанныеКартинки <> Неопределено Тогда
КартинкаОбъект = Новый Картинка(ДвоичныеДанныеКартинки);
// Далее выводим КартинкаОбъект на форму
КонецЕсли;
Исключение
Сообщить("Ошибка при создании объекта компоненты: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЕсли;
Обратите внимание на ProgID. В зависимости от версии компоненты он может отличаться. Часто возникающая ошибка "Тип не определен" при вызове Новый связана с тем, что компонента не была успешно загружена в память мобильного устройства или идентификатор указан неверно.
Иногда внешние компоненты, написанные на Android Studio (например, на базе библиотеки ZXing), возвращают "сырые" байты изображения. Если вы просто попытаетесь создать объект Новый Картинка(ДвоичныеДанные) из массива единиц и нулей, 1С выдаст ошибку формата.
Проанализируем ситуацию: объект Картинка в 1С ожидает полноценный файл (PNG, JPEG, BMP). Если компонента отдает массив байтов пикселей, вам необходимо программно сформировать заголовок BMP (BITMAPFILEHEADER и BITMAPINFOHEADER). Это включает в себя указание ширины, высоты, глубины цвета и размера файла. Без этого заголовка платформа не сможет интерпретировать данные как изображение.
Если работа с нативными компонентами кажется слишком сложной или нестабильной, существует "чистый" способ реализации генерации QR-кодов, который работает полностью в офлайне и не зависит от архитектуры процессора устройства. Это использование поля HTML-документа.
Разберем по шагам этот метод:
qrcode.js (популярная легковесная библиотека на JS).<div>.base64. Скрипт генерирует картинку, переводит ее в base64, и вы забираете эту строку через событие ПриНажатии или через программное чтение содержимого документа.Пример формирования текста HTML:
ТекстHTML =
"<html>
|<head>
| <script src='qrcode.min.js'></script>
|</head>
|<body>
| <div id='qrcode'></div>
| <script>
| new QRCode(document.getElementById('qrcode'), '" + СтрокаДляКода + "');
| </script>
|</body>
|</html>";
Этот метод крайне надежен, так как движок WebKit на Android отлично справляется с рендерингом и не требует специфических разрешений системы.
Не путайте генерацию со сканированием. Если ваша задача — считать код, то начиная с версии платформы 8.3.15, 1С предоставляет мощный встроенный инструмент, не требующий внешних компонент: СредстваМультимедиа.СканироватьШтрихкод.
Посмотрим на пример использования встроенного сканера:
&НаКлиенте
Процедура Сканировать(Команда)
Оповещение = Новый ОписаниеОповещения("ОбработатьСканирование", ЭтотОбъект);
СредстваМультимедиа.ПоказатьСканированиеШтрихкодов("Наведите камеру на код", Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьСканирование(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено Тогда
ТекстКода = Результат.Значение;
Сообщить("Считан код: " + ТекстКода);
КонецЕсли;
КонецПроцедуры
Этот метод вызывает стандартное окно камеры, оптимизированное под мобильную платформу, и возвращает результат напрямую в код 1С.
Для реализации полноценной работы со штрихкодами на мобильном Android мы рекомендуем следующий порядок действий:
СредстваМультимедиа. Это гарантирует совместимость с будущими обновлениями платформы.Intents.Таким образом, задача генерации и обработки баркодов на мобильной платформе 1С сегодня решается гораздо проще, чем несколько лет назад, благодаря развитию встроенных функций мультимедиа и стабилизации нативных компонент в составе БПО.