Как сгенерировать и вывести QR-код на печать в 1С:Предприятие

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

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

Анализ механизмов генерации QR-кода

Для начала проанализируем, какими инструментами мы располагаем. В типовых конфигурациях 1С (таких как Розница, Управление торговлей или ERP) уже встроены механизмы для работы со штрихкодами — для этой задачи подойдёт решение для вывода штрихкодов в печатные формы. Основным инструментом является внешняя компонента, которая обычно хранится в общем макете под названием КомпонентаПечатиQRКода.

Рассмотрим два основных способа реализации: прямой вызов компоненты и использование высокоуровневых модулей БСП. Современный стандарт разработки рекомендует использовать программный интерфейс БСП, так как он обеспечивает кроссплатформенность (работу и в Windows, и в Linux) и корректную обработку ошибок.

Способ 1. Использование актуальных модулей БСП

Если ваша конфигурация построена на базе БСП версии 3.0 и выше, проанализируем возможности общего модуля ГенерацияШтрихкода. Этот модуль инкапсулирует в себе всю логику подключения компоненты и формирования изображения. Нам не нужно вручную заботиться о выгрузке бинарных файлов компоненты во временные папки.

Разберем пример кода, который подготавливает данные и получает картинку:


// Подготовим данные из двух реквизитов документа
ТекстДляКода = Объект.Реквизит1 + "|" + Объект.Реквизит2;

// Установим параметры генерации
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("ТипШтрихкода", 16); // 16 соответствует QR-коду
ПараметрыШтрихкода.Вставить("Текст", ТекстДляКода);
ПараметрыШтрихкода.Вставить("Ширина", 200);
ПараметрыШтрихкода.Вставить("Высота", 200);
ПараметрыШтрихкода.Вставить("УровеньКоррекцииОшибок", 1); // Уровень M

// Получаем результат через БСП
Результат = МенеджерПечати.СформироватьКартинкуШтрихкода(ПараметрыШтрихкода);

Если Результат.Результат Тогда
    КартинкаQR = Результат.Картинка;
КонецЕсли;

Способ 2. Прямое использование компоненты (низкоуровневый подход)

Выясним, как поступить, если необходимо реализовать логику «с нуля» или в самописной конфигурации. Для этого нам понадобится общий макет КомпонентаПечатиQRКода. Проанализируем функцию для подключения этой компоненты и генерации данных.

Рассмотрим по шагам процесс подключения компоненты Native API:


Функция ПолучитьКартинкуQRКода(ТекстКода, Размер = 200) Экспорт
    
    // Пытаемся подключить компоненту из общего макета
    ИмяМакета = "ОбщийМакет.КомпонентаПечатиQRКода";
    Подключение = ОбщегоНазначения.ПодключитьКомпонентуИзМакета("QRCodeExtension", ИмяМакета);
    
    Если Подключение = Неопределено Тогда
        ЗаписьЖурналаРегистрации("ПечатьQR", УровеньЖурналаРегистрации.Ошибка, , , "Не удалось загрузить компоненту.");
        Возврат Неопределено;
    КонецЕсли;

    // Уровень коррекции: 0-L, 1-M, 2-Q, 3-H
    УровеньКоррекции = 1; 
    
    Попытка
        // Метод GenerateQRCode возвращает двоичные данные картинки
        ДвоичныеДанные = Подключение.GenerateQRCode(ТекстКода, УровеньКоррекции, Размер);
        Возврат Новый Картинка(ДвоичныеДанные);
    Исключение
        Возврат Неопределено;
    КонецПопытки;
    
КонецФункции

Подготовка макета печатной формы

Сгенерировать картинку — это только половина дела. Теперь разберем, как вывести её в табличный документ. Если вы не хотите писать код, можно использовать конструктор печатных форм (удобно через инструмент создания и редактирования печатных форм), но в этой статье мы посмотрим на алгоритм ручной настройки макета:

  1. Откроем макет вашей печатной формы.
  2. В меню выберем пункт Таблица — Рисунки — Вставить картинку.
  3. В появившемся окне выберем любую «заглушку» или просто создадим пустую область.
  4. Важно: в свойствах созданного рисунка укажем имя, например, QRКод. Это имя мы будем использовать в коде для обращения к объекту.
  5. Установим режим размера картинки — Пропорционально, чтобы QR-код не искажался при печати.

Программный вывод в табличный документ

Проанализируем финальный этап — заполнение области макета данными. Допустим, у нас есть область Подвал (где также часто размещают логотип организации и факсимиле), где мы разместили наш рисунок — для этого подойдёт обработка добавления QR-кода в счет на оплату.


// Получаем область из макета
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");

// Формируем текст из двух реквизитов
ДанныеДляПечати = Строка(СсылкаНаОбъект.Номер) + ";" + Строка(СсылкаНаОбъект.Дата);

// Генерируем картинку (используя функцию из Способа 2)
КартинкаQR = ПолучитьКартинкуQRКода(ДанныеДляПечати);

Если КартинкаQR <> Неопределено Тогда
    // Обращаемся к коллекции рисунков области по имени, которое мы дали в макете
    ОбластьПодвал.Рисунки.QRКод.Картинка = КартинкаQR;
КонецЕсли;

// Выводим область в итоговый документ
ТабДок.Вывести(ОбластьПодвал);

Важные технические нюансы

Рассмотрим подробнее параметры, которые влияют на считываемость кода. Помимо QR-кодов, часто требуется установка штампа в PDF, но при объединении строк для кода обязательно используйте разделитель (например, символ ; или |), чтобы сторонние приложения могли корректно распарсить данные.

Уровни коррекции ошибок (Error Correction Level):

Проанализируем также вопрос кодировки. Компонента 1С ожидает строку в формате UTF-8. Если вы используете кириллицу и код не считывается, убедитесь, что передаваемая строка не содержит специфических символов, которые могут интерпретироваться некорректно в других кодировках.

Работа на Linux: Использование Native API (как в коде выше) позволяет коду работать на серверах под управлением Linux без установки эмуляторов типа Wine. Это критически важно для современных отказоустойчивых систем.

Таким образом, мы выяснили, что для успешного вывода QR-кода необходимо объединить данные, воспользоваться надежной внешней компонентой из состава БСП и правильно настроить объект Рисунок в макете табличного документа. Этот комплексный подход гарантирует стабильную работу печати в любых условиях.

← На главную