Как подключить и использовать типовую компоненту 1С для генерации QR-кодов во внешней обработке?

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

В современных конфигурациях 1С, разработанных на базе Библиотеки стандартных подсистем (БСП), таких как Управление торговлей 11, ERP 2, Комплексная автоматизация или Бухгалтерия предприятия, присутствует мощный встроенный механизм для генерации QR-кодов. Он основан на использовании внешней компоненты, разработанной по технологии Native API.

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

Шаг 1. Извлечение компоненты из типовой конфигурации

Для начала разберем, откуда берется сама компонента. В БСП за генерацию кодов отвечает внешняя компонента с идентификатором QRCodeExtension. В составе конфигурации она хранится в виде ZIP-архива в общем макете.

Выполним следующие подготовительные действия:

  1. Откроем конфигуратор вашей типовой базы (например, УТ 11 или БП 3.0).
  2. В дереве метаданных перейдем в ветку Общие -> Общие макеты.
  3. Найдем макет с именем КомпонентаПечатиQRКода.
  4. Щелкнем по нему правой кнопкой мыши и выберем пункт Сохранить в файл.... Сохраним архив на диск под именем КомпонентаПечатиQRКода.zip.
  5. Откроем вашу внешнюю обработку в конфигураторе, перейдем на вкладку Макеты, добавим новый макет с типом Двоичные данные и назовем его аналогично — КомпонентаПечатиQRКода. Загрузим в него ранее сохраненный ZIP-архив.

Теперь внешняя компонента упакована непосредственно внутрь нашей обработки, что обеспечивает ее полную автономность.

Шаг 2. Программное подключение компоненты на сервере

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


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

Проанализируем этот код: мы используем технологию Native API через класс AddIn.QR.QRCodeExtension. Данное решение кроссплатформенно, отлично работает на серверах под управлением как Windows, так и Linux, а также поддерживается в мобильных клиентах 1С.

Шаг 3. Генерация картинки QR-кода

После успешного создания объекта внешней компоненты мы можем вызвать ее ключевой метод — GenerateQRCode. Этот метод принимает на вход три параметра:

  1. СтрокаДанных — текстовая строка, которую необходимо закодировать в QR-код.
  2. УровеньКоррекции — число от 0 до 3, определяющее избыточность информации для восстановления при повреждении картинки (0 — 7%, 1 — 15%, 2 — 25%, 3 — 35%). Оптимально использовать значение 1 или 0.
  3. Размер — размер стороны результирующего квадратного PNG-изображения в пикселях.

Рассмотрим по шагам процесс генерации двоичных данных картинки и вывода ее в табличный документ:


Функция СформироватьКартинкуQRКода(Знач ТекстКода, Знач РазмерПикселей = 190) Экспорт
    
    ГенераторQR = ИнициализироватьГенераторQR();
    Если ГенераторQR = Неопределено Тогда
        ВызватьИсключение "Ошибка инициализации компоненты генерации QR-кодов!";
    КонецЕсли;
    
    УровеньКоррекцииОшибок = 1; // Средний уровень коррекции
    
    Попытка
        // Метод GenerateQRCode возвращает ДвоичныеДанные PNG-картинки
        ДвоичныеДанныеКартинки = ГенераторQR.GenerateQRCode(ТекстКода, УровеньКоррекцииОшибок, РазмерПикселей);
        Если ТипЗнч(ДвоичныеДанныеКартинки) = Тип("ДвоичныеДанные") Тогда
            Возврат Новый Картинка(ДвоичныеДанныеКартинки);
        Иначе
            ВызватьИсключение "Компонента вернула некорректный тип данных.";
        КонецЕсли;
    Исключение
        ЗаписьЖурналаРегистрации("ГенерацияQRКода", УровеньЖурналаРегистрации.Ошибка,,, 
            "Ошибка при вызове GenerateQRCode: " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;
    
КонецФункции

Полученную картинку легко поместить на форму или вывести в рисунок табличного документа при формировании печатной формы:


КартинкаQR = СформироватьКартинкуQRКода("https://1c.ru", 200);
Если КартинкаQR <> Неопределено Тогда
    ОбластьМакета.Рисунки.ИмяРисункаQR.Картинка = КартинкаQR;
КонецЕсли;

Шаг 4. Альтернативный метод работы через БСП (если база типовая)

Если ваша внешняя обработка запускается внутри конфигурации, где гарантированно присутствует БСП (например, УТ 11, КА 2, ERP или БП 3), вам не обязательно хранить компоненту внутри макета обработки и подключать ее вручную. Проанализируем, как обратиться к стандартному программному интерфейсу БСП.

В более старых версиях БСП для получения двоичных данных использовалась функция общего модуля УправлениеПечатью:


ДанныеQRКода = УправлениеПечатью.ДанныеQRКода(QRСтрока, 1, 190);
КартинкаQR = Новый Картинка(ДанныеQRКода);

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


ДанныеQRКода = ГенерацияШтрихкодаВызовСервера.ДанныеQRКода(QRСтрока, 1, 190);
КартинкаQR = Новый Картинка(ДанныеQRКода);

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

Шаг 5. Тонкости формирования платежных QR-кодов (ГОСТ Р 56042-2014)

Разберем важнейший нюанс, с которым часто сталкиваются разработчики при реализации оплаты по QR-коду через банковские приложения. Если просто закодировать в строку банковские реквизиты, мобильные приложения банков (например, Сбербанк Онлайн) не смогут распознать этот код как платежный документ. Нам необходимо строго следовать стандарту ГОСТ Р 56042-2014.

Основные правила кодирования платежного QR-кода:

  1. Строка должна начинаться со служебного префикса версии и кодировки.
  2. Каждый реквизит должен отделяться символом вертикальной черты |.
  3. Реквизиты состоят из пар Ключ=Значение.

Выясним причину частой проблемы, связанной с отображением русских букв («крякозябр») при сканировании кода. Проблема кроется в неверно выбранной версии стандарта в префиксе:

Посмотрим на пример правильного формирования платежной строки по стандарту ГОСТ:


Функция СформироватьСтрокуПлатежаГОСТ(Реквизиты)
    
    // Используем заголовок стандарта версии 1.2 для поддержки UTF-8
    СтрокаГОСТ = "ST00012|";
    
    // Обязательные реквизиты платежа
    СтрокаГОСТ = СтрокаГОСТ + "Name="        + СокрЛП(Реквизиты.Получатель)    + "|";
    СтрокаГОСТ = СтрокаГОСТ + "PersonalAcc=" + СокрЛП(Реквизиты.РасчетныйСчет) + "|";
    СтрокаГОСТ = СтрокаГОСТ + "BankName="    + СокрЛП(Реквизиты.БанкПолучателя)+ "|";
    СтрокаГОСТ = СтрокаГОСТ + "BIC="         + СокрЛП(Реквизиты.БИК)           + "|";
    СтрокаГОСТ = СтрокаГОСТ + "CorrespAcc="  + СокрЛП(Реквизиты.КоррСчет)      + "|";
    
    // Дополнительные реквизиты
    Если ЗначениеЗаполнено(Реквизиты.ИНН) Тогда
        СтрокаГОСТ = СтрокаГОСТ + "PayeeINN=" + СокрЛП(Реквизиты.ИНН) + "|";
    КонецЕсли;
    
    Если ЗначениеЗаполнено(Реквизиты.КПП) Тогда
        СтрокаГОСТ = СтрокаГОСТ + "KPP=" + СокрЛП(Реквизиты.КПП) + "|";
    КонецЕсли;
    
    // Сумма указывается в копейках (целым числом)
    СуммаВКопейках = Формат(Реквизиты.СуммаДокумента * 100, "ЧГ=0");
    СтрокаГОСТ = СтрокаГОСТ + "Sum=" + СуммаВКопейках + "|";
    
    СтрокаГОСТ = СтрокаГОСТ + "Purpose=" + СокрЛП(Реквизиты.НазначениеПлатежа);
    
    Возврат СтрокаГОСТ;
    
КонецФункции

Передавая сформированную по такому шаблону строку в нашу функцию СформироватьКартинкуQRКода, вы получите полностью валидный и готовый к оплате QR-код, который мгновенно распознается любым банковским терминалом или мобильным приложением.

← На главную