Как программно сформировать и вывести на печать QR-код в самописном документе на платформе «1С:Предприятие 8»?

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

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

В данной статье мы подробно рассмотрим несколько профессиональных способов решения этой задачи: от использования встроенных механизмов Библиотеки стандартных подсистем (БСП) до альтернативных методов на базе внешних API и JavaScript.

Метод 1. Использование встроенной компоненты печати штрихкодов (БСП)

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

Рассмотрим по шагам, как склеить два реквизита документа, передать их в компоненту и вывести картинку в макет печатной формы.

Шаг 1. Подготовка текстовой строки

Для начала объединим значения двух реквизитов нашего документа. Рекомендуется использовать разделитель (например, символ перевода строки или вертикальную черту), чтобы принимающая сторона могла легко распарсить данные.


Реквизит1 = СсылкаНаДокумент.Организация.ИНН;
Реквизит2 = СсылкаНаДокумент.Номер;

// Объединяем реквизиты в одну строку
QRСтрока = "ИНН:" + СокрЛП(Реквизит1) + "|" + "Док:" + СокрЛП(Реквизит2);

Шаг 2. Получение двоичных данных картинки через функции БСП

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

Проанализируем пример процедуры генерации и вывода:


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

Решение проблемы с кодировкой (UTF-8 против Windows-1251)

Частой технической проблемой при сканировании сгенерированного QR-кода мобильными устройствами является неверное отображение кириллических символов (вместо букв выводятся знаки вопроса или кракозябры). Это происходит из-за того, что по умолчанию платформа передает строку в кодировке Windows-1251, в то время как большинство современных сканеров ожидают UTF-8.

Для того чтобы принудительно перекодировать строку в UTF-8 перед отправкой в генератор, мы можем использовать встроенный объект платформы ЗаписьДанных совместно с ПотокВПамяти. Выясним, как написать вспомогательную функцию преобразования:


Функция ПреобразоватьСтрокуВ_UTF8(ВходнаяСтрока) Экспорт
    Поток = Новый ПотокВПамяти;
    ЗаписьДанных = Новый ЗаписьДанных(Поток, КодировкаТекста.UTF8, , Ложь);
    ЗаписьДанных.ЗаписатьСтроку(ВходнаяСтрока);
    ЗаписьДанных.Закрыть();
    
    ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
    Результат = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные, КодировкаТекста.ANSI);
    Возврат Результат;
КонецФункции

Если вы формируете QR-код для совершения платежей (например, по стандарту СБП или ГОСТ Р 56042-2014), обязательно добавляйте в начало строки маркер кодировки. Согласно стандарту, строка в кодировке UTF-8 должна начинаться с префикса ST00012|.

Правильная настройка области рисунка в табличном документе

Чтобы QR-код успешно считывался любыми смартфонами и сканерами, критически важно правильно расположить его на печатной форме:

  1. Откройте макет вашей печатной формы в конфигураторе.
  2. Вставьте объект Рисунок (Меню: Таблица -> Рисунки -> Вставить картинку). Выберите любую временную картинку.
  3. Задайте рисунку уникальное имя в свойствах, например, РисунокQR. Это имя мы используем для обращения к нему из кода.
  4. Важный нюанс: Установите свойство рисунка РазмерКартинки (PictureSize) в значение Пропорционально (Proportional). Ни в коем случае не используйте значение Растянуть, так как это нарушит пропорции квадратов штрихкода, и его невозможно будет считать.
  5. Для улучшения эстетического вида и облегчения распознавания отключите границы рисунка, установив свойство Линия в значение Нет линии. вокруг QR-кода должна оставаться свободная рамка (белое поле).

Метод 2. Использование внешних HTTP-сервисов (для баз без БСП)

Если вы работаете в полностью самописной конфигурации «с нуля», где нет библиотек БСП, и вы не хотите подключать внешние dll-файлы, можно использовать метод запроса к бесплатным публичным API генераторам (например, к популярному сервису qrserver).

Рассмотрим пример функции, которая отправляет запрос к веб-сервису и возвращает готовую картинку:


Функция ПолучитьQRКодЧерезAPI(ТекстДляКодирования) Экспорт
    
    // Кодируем строку для URL-запроса
    КодированныйТекст = КодироватьСтроку(ТекстДляКодирования, СпособКодированияСтроки.КодироватьИменаUpi);
    
    // Параметры запроса: size - размер картинки, data - кодируемые данные
    АдресЗапроса = "/v1/create-qr-code/?size=200x200&data=" + КодированныйТекст;
    
    Попытка
        HTTPСоединение = Новый HTTPСоединение("api.qrserver.com", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
        HTTPЗапрос = Новый HTTPЗапрос(АдресЗапроса);
        HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
        
        Если HTTPОтвет.КодСостояния = 200 Тогда
            ДвоичныеДанныеКартинки = HTTPОтвет.ПолучитьТелоКакДвоичныеДанные();
            Возврат Новый Картинка(ДвоичныеДанныеКартинки);
        КонецЕсли;
    Исключение
        ЗаписьЖурналаРегистрации("ГенерацияQR", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    КонецПопытки;
    
    Возврат Неопределено;
КонецФункции

Важное предупреждение о безопасности: Передача конфиденциальной информации клиентов или коммерческих данных на внешние интернет-ресурсы может нарушать требования корпоративной безопасности. В таком случае рекомендуется развернуть аналогичную легковесную службу генерации кодов на вашем локальном сервере внутри сети (например, на Node.js или Python) и обращаться к ней по локальному IP-адресу.

Метод 3. Локальная генерация на клиенте через JavaScript и HTML-поле

Этот способ незаменим, если база работает в веб-клиенте на мобильных устройствах без возможности установки сторонних расширений 1С.

Суть метода заключается в интеграции JS-библиотеки (например, qrcode.js) в HTML-макет внутри платформы:

  1. Создайте в конфигурации общий макет с типом Текстовый документ и поместите туда код JS-библиотеки генератора QR-кодов.
  2. На управляемую форму добавьте реквизит с типом Строка и перетащите его на форму как Поле HTML документа.
  3. При инициализации формы передайте HTML-шаблон со скриптом в это поле, а при изменении реквизитов документа вызывайте JS-функцию генерации. Код отработает локально на стороне браузера пользователя, мгновенно сформировав картинку в Base64.
  4. Полученную строку Base64 можно передать обратно на сервер 1С, преобразовать в двоичные данные и вывести в табличный документ для последующей печати.

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

← На главную