В современных конфигурациях 1С, разработанных на базе Библиотеки стандартных подсистем (БСП), таких как Управление торговлей 11, ERP 2, Комплексная автоматизация или Бухгалтерия предприятия, присутствует мощный встроенный механизм для генерации QR-кодов. Он основан на использовании внешней компоненты, разработанной по технологии Native API.
Часто перед разработчиком встает задача перенести этот функционал во внешнюю обработку или отчет, сделав инструмент полностью автономным и независимым от наличия конкретных общих модулей в базе данных. В этой статье мы подробно разберем, как извлечь компоненту из типового решения, подключить ее в своей обработке и правильно сформировать QR-код, включая требования к кодированию платежных реквизитов по ГОСТ. Для быстрой проверки и тестирования создаваемых решений подойдёт инструмент для отладки внешних печатных форм и обработок.
Для начала разберем, откуда берется сама компонента. В БСП за генерацию кодов отвечает внешняя компонента с идентификатором QRCodeExtension. В составе конфигурации она хранится в виде ZIP-архива в общем макете.
Выполним следующие подготовительные действия:
КомпонентаПечатиQRКода.КомпонентаПечатиQRКода.zip.КомпонентаПечатиQRКода. Загрузим в него ранее сохраненный ZIP-архив.Теперь внешняя компонента упакована непосредственно внутрь нашей обработки, что обеспечивает ее полную автономность.
Для инициализации компоненты напрямую из макета нашей внешней обработки напишем процедуру подключения. Нам понадобится поместить макет во временное хранилище, а затем вызвать метод платформы ПодключитьВнешнююКомпоненту. Рассмотрим пример реализации этой логики:
Функция ИнициализироватьГенераторQR() Экспорт
// Получаем двоичные данные компоненты из макета внешней обработки
МакетКомпоненты = ЭтотОбъект.ПолучитьМакет("КомпонентаПечатиQRКода");
АдресВременногоХранилища = ПоместитьВоВременноеХранилище(МакетКомпоненты);
// Подключаем компоненту с использованием уникального имени "QR"
Если ПодключитьВнешнююКомпоненту(АдресВременногоХранилища, "QR") Тогда
Попытка
// Создаем объект компоненты Native API
Возврат Новый("AddIn.QR.QRCodeExtension");
Исключение
ЗаписьЖурналаРегистрации("ГенерацияQRКода", УровеньЖурналаРегистрации.Ошибка,,,
"Не удалось создать объект компоненты AddIn.QR.QRCodeExtension. Ошибка: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
Иначе
ЗаписьЖурналаРегистрации("ГенерацияQRКода", УровеньЖурналаРегистрации.Ошибка,,,
"Не удалось подключить внешнюю компоненту из временного хранилища.");
Возврат Неопределено;
КонецЕсли;
КонецФункции
Проанализируем этот код: мы используем технологию Native API через класс AddIn.QR.QRCodeExtension. Данное решение кроссплатформенно, отлично работает на серверах под управлением как Windows, так и Linux, а также поддерживается в мобильных клиентах 1С.
После успешного создания объекта внешней компоненты мы можем вызвать ее ключевой метод — GenerateQRCode. Этот метод принимает на вход три параметра:
1 или 0.Рассмотрим по шагам процесс генерации двоичных данных картинки и вывода ее в табличный документ:
Функция СформироватьКартинкуQRКода(Знач ТекстКода, Знач РазмерПикселей = 190) Экспорт
ГенераторQR = ИнициализироватьГенераторQR();
Если ГенераторQR = Неопределено Тогда
ВызватьИсключение "Ошибка инициализации компоненты генерации QR-кодов!";
КонецЕсли;
УровеньКоррекцииОшибок = 1; // Средний уровень коррекции
Попытка
// Метод GenerateQRCode возвращает ДвоичныеДанные PNG-картинки
ДвоичныеДанныеКартинки = ГенераторQR.GenerateQRCode(ТекстКода, УровеньКоррекцииОшибок, РазмерПикселей);
Если ТипЗнч(ДвоичныеДанныеКартинки) = Тип("ДвоичныеДанные") Тогда
Возврат Новый Картинка(ДвоичныеДанныеКартинки);
Иначе
ВызватьИсключение "Компонента вернула некорректный тип данных.";
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("ГенерацияQRКода", УровеньЖурналаРегистрации.Ошибка,,,
"Ошибка при вызове GenerateQRCode: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
Полученную картинку легко поместить на форму или вывести в рисунок табличного документа при формировании печатной формы:
КартинкаQR = СформироватьКартинкуQRКода("https://1c.ru", 200);
Если КартинкаQR <> Неопределено Тогда
ОбластьМакета.Рисунки.ИмяРисункаQR.Картинка = КартинкаQR;
КонецЕсли;
Если ваша внешняя обработка запускается внутри конфигурации, где гарантированно присутствует БСП (например, УТ 11, КА 2, ERP или БП 3), вам не обязательно хранить компоненту внутри макета обработки и подключать ее вручную. Проанализируем, как обратиться к стандартному программному интерфейсу БСП.
В более старых версиях БСП для получения двоичных данных использовалась функция общего модуля УправлениеПечатью:
ДанныеQRКода = УправлениеПечатью.ДанныеQRКода(QRСтрока, 1, 190);
КартинкаQR = Новый Картинка(ДанныеQRКода);
В современных редакциях БСП разработчики фирмы 1С выделили работу со штрихкодами в специализированный модуль. Теперь рекомендуется использовать функции общего модуля ГенерацияШтрихкода или его серверного аналога:
ДанныеQRКода = ГенерацияШтрихкодаВызовСервера.ДанныеQRКода(QRСтрока, 1, 190);
КартинкаQR = Новый Картинка(ДанныеQRКода);
Преимущество этого метода в том, что платформа сама следит за актуальностью и кэшированием внешних компонент в системе. Для ускорения разработки модулей под типовые конфигурации можно использовать шаблон дополнительной обработки для конфигураций на БСП.
Разберем важнейший нюанс, с которым часто сталкиваются разработчики при реализации оплаты по QR-коду через банковские приложения. Если просто закодировать в строку банковские реквизиты, мобильные приложения банков (например, Сбербанк Онлайн) не смогут распознать этот код как платежный документ. Нам необходимо строго следовать стандарту ГОСТ Р 56042-2014.
Основные правила кодирования платежного QR-кода:
|.Ключ=Значение.Выясним причину частой проблемы, связанной с отображением русских букв («крякозябр») при сканировании кода. Проблема кроется в неверно выбранной версии стандарта в префиксе:
ST00011 указывает на кодировку Windows-1251. На многих современных смартфонах и в банковских приложениях декодирование кириллицы из этой кодировки ломается.ST00012 переводит обработчик в режим кодировки UTF-8. Использование этого заголовка гарантирует безошибочное распознавание русских наименований получателя и назначения платежа на любых устройствах.Посмотрим на пример правильного формирования платежной строки по стандарту ГОСТ:
Функция СформироватьСтрокуПлатежаГОСТ(Реквизиты)
// Используем заголовок стандарта версии 1.2 для поддержки UTF-8
СтрокаГОСТ = "ST00012|";
// Обязательные реквизиты платежа
СтрокаГОСТ = СтрокаГОСТ + "Name=" + СокрЛП(Реквизиты.Получатель) + "|";
СтрокаГОСТ = СтрокаГОСТ + "PersonalAcc=" + СокрЛП(Реквизиты.РасчетныйСчет) + "|";
СтрокаГОСТ = СтрокаГОСТ + "BankName=" + СокрЛП(Реквизиты.БанкПолучателя)+ "|";
СтрокаГОСТ = СтрокаГОСТ + "BIC=" + СокрЛП(Реквизиты.БИК) + "|";
СтрокаГОСТ = СтрокаГОСТ + "CorrespAcc=" + СокрЛП(Реквизиты.КоррСчет) + "|";
// Дополнительные реквизиты
Если ЗначениеЗаполнено(Реквизиты.ИНН) Тогда
СтрокаГОСТ = СтрокаГОСТ + "PayeeINN=" + СокрЛП(Реквизиты.ИНН) + "|";
КонецЕсли;
Если ЗначениеЗаполнено(Реквизиты.КПП) Тогда
СтрокаГОСТ = СтрокаГОСТ + "KPP=" + СокрЛП(Реквизиты.КПП) + "|";
КонецЕсли;
// Сумма указывается в копейках (целым числом)
СуммаВКопейках = Формат(Реквизиты.СуммаДокумента * 100, "ЧГ=0");
СтрокаГОСТ = СтрокаГОСТ + "Sum=" + СуммаВКопейках + "|";
СтрокаГОСТ = СтрокаГОСТ + "Purpose=" + СокрЛП(Реквизиты.НазначениеПлатежа);
Возврат СтрокаГОСТ;
КонецФункции
Передавая сформированную по такому шаблону строку в нашу функцию СформироватьКартинкуQRКода, вы получите полностью валидный и готовый к оплате QR-код, который мгновенно распознается любым банковским терминалом или мобильным приложением.