Как реализовать генерацию QR-кода на мобильной платформе 1С для Android

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разработка для мобильных платформ в экосистеме 1С имеет свои особенности, особенно когда речь заходит о взаимодействии с аппаратными функциями или специфическими библиотеками. Одной из частых задач является генерация штрихкодов и QR-кодов непосредственно на мобильном устройстве без обращения к серверу или внешним API. В этой статье мы проанализируем ситуацию, разберем доступные методы и посмотрим на примеры кода, которые помогут вам внедрить этот функционал в свои мобильные приложения.

Использование «1С:Библиотеки подключаемого оборудования для мобильных приложений» (БПО)

Самый правильный и поддерживаемый путь — использование типовых решений от фирмы 1С. В мобильной версии БПО (начиная с версий 2.10.8 и выше, а тем более в современной редакции 3.0) уже предусмотрены механизмы для работы со штрихкодами. Разберем, как это реализовано.

В составе БПО есть демонстрационная база, где представлена обработка Демо печать штрихкода. Она служит отличным примером для интеграции. Основная логика заключается в использовании внешней компоненты, которая поставляется вместе с библиотекой. Для работы с ней необходимо выполнить следующие шаги:

  1. Интегрировать подсистему БПО в вашу конфигурацию.
  2. Использовать макет с внешней компонентой (обычно это Native API компонента для Android).
  3. Вызвать методы генерации, передав туда строку и параметры (размер, уровень коррекции).

Важный момент: современные версии БПО объединяют хранилища для стационарных и мобильных платформ, что упрощает поддержку кода. В мобильном клиенте или мобильном приложении нативная компонента 1С для печати штрихкодов позволяет генерировать QR-коды, DataMatrix и стандартные линейные коды (EAN-13).

Программное подключение внешней компоненты (Native API)

Если вы решили использовать компоненту отдельно от БПО или пишете собственное решение, нам потребуется механизм ПодключитьВнешнююКомпоненту. Рассмотрим пример кода, который инициализирует драйвер сканера и генератора:


// Устанавливаем компоненту из макета
РезультатУстановки = УстановитьВнешнююКомпоненту("ОбщийМакет.Драйвер1ССканерШтрихкода");

Если РезультатУстановки Тогда
    // Формируем программный идентификатор
    ИмяОбъекта = "MobileBarcodeScanner";
    ПрогИД = "AddIn.MobileBarcodeScanner.MobileBarcodeScanner";
    
    // Подключаем компоненту
    ВнешняяКомпонентаПодключена = ПодключитьВнешнююКомпоненту("ОбщийМакет.Драйвер1ССканерШтрихкода", "MobileBarcodeScanner", ТипВнешнейКомпоненты.Native);
    
    Если ВнешняяКомпонентаПодключена Тогда
        Попытка
            ГенераторQRКода = Новый (ПрогИД);
            // Параметры: Текст, Уровень коррекции (0-3), Размер картинки
            ДвоичныеДанныеКартинки = ГенераторQRКода.GenerateQRCode("https://1c.ru", 0, 300);
            
            Если ДвоичныеДанныеКартинки <> Неопределено Тогда
                КартинкаОбъект = Новый Картинка(ДвоичныеДанныеКартинки);
                // Далее выводим КартинкаОбъект на форму
            КонецЕсли;
        Исключение
            Сообщить("Ошибка при создании объекта компоненты: " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
КонецЕсли;

Обратите внимание на ProgID. В зависимости от версии компоненты он может отличаться. Часто возникающая ошибка "Тип не определен" при вызове Новый связана с тем, что компонента не была успешно загружена в память мобильного устройства или идентификатор указан неверно.

Технические нюансы: формат данных и BMP-заголовки

Иногда внешние компоненты, написанные на Android Studio (например, на базе библиотеки ZXing), возвращают "сырые" байты изображения. Если вы просто попытаетесь создать объект Новый Картинка(ДвоичныеДанные) из массива единиц и нулей, 1С выдаст ошибку формата.

Проанализируем ситуацию: объект Картинка в 1С ожидает полноценный файл (PNG, JPEG, BMP). Если компонента отдает массив байтов пикселей, вам необходимо программно сформировать заголовок BMP (BITMAPFILEHEADER и BITMAPINFOHEADER). Это включает в себя указание ширины, высоты, глубины цвета и размера файла. Без этого заголовка платформа не сможет интерпретировать данные как изображение.

Альтернативный метод: Генерация через HTML и JavaScript

Если работа с нативными компонентами кажется слишком сложной или нестабильной, существует "чистый" способ реализации генерации QR-кодов, который работает полностью в офлайне и не зависит от архитектуры процессора устройства. Это использование поля HTML-документа.

Разберем по шагам этот метод:

  1. Добавьте в макет конфигурации текстовый файл с библиотекой qrcode.js (популярная легковесная библиотека на JS).
  2. На форму мобильного приложения добавьте поле HTML-документа.
  3. Сформируйте HTML-код, который подключает скрипт и вызывает функцию генерации QR-кода в контейнере <div>.
  4. Для получения результата обратно в 1С можно использовать механизм 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 мы рекомендуем следующий порядок действий:

  1. Для сканирования: Всегда используйте штатный метод СредстваМультимедиа. Это гарантирует совместимость с будущими обновлениями платформы.
  2. Для генерации (стандартный путь): Используйте компоненты из актуальной мобильной БПО. Это даст вам поддержку всех современных форматов (включая DataMatrix для маркировки).
  3. Для генерации (гибкий путь): Используйте HTML-поле и JavaScript-библиотеки, если вам нужно полное управление дизайном и независимость от внешних файлов компонент.
  4. Собственная ВК: К написанию собственной компоненты в Android Studio стоит прибегать только в случае специфических требований к производительности или при работе с промышленными ТСД, имеющими встроенные лазерные сканеры, которые требуют обработки специальных Intents.

Таким образом, задача генерации и обработки баркодов на мобильной платформе 1С сегодня решается гораздо проще, чем несколько лет назад, благодаря развитию встроенных функций мультимедиа и стабилизации нативных компонент в составе БПО.

← На главную