Генерация QR-кодов в 1С 8.3: способы и примеры кода

· 9 мин

Содержание

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

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

Ниже — все три пути с примерами, плюс важное различие между QR для оплаты и кодами маркировки «Честный ЗНАК»: это два разных формата, и путать их — частая ошибка.

Что умеет штатная компонента печати штрихкодов

Платформа 1С:Предприятие 8.3 поставляется с внешней компонентой печати штрихкодов. Она ставится вместе с платформой (в составе макетов библиотеки) и умеет рисовать как линейные коды (EAN-13, Code 128), так и двумерные — QR, DataMatrix, PDF417.

Компонента работает на сервере, поэтому картинку можно сформировать в серверном контексте и передать на клиент — это важно для веб-клиента и тонкого клиента . На серверах под Linux используется native-вариант компоненты, отдельной установки ActiveX не требуется.

Что компонента позволяет задать для QR:

  • 🔤 содержимое — любая строка: ссылка, текст, реквизиты платежа;
  • 📐 размер картинки в пикселях (ширина и высота);
  • 🎯 уровень коррекции ошибок — чем выше, тем устойчивее код к повреждениям, но тем он плотнее;
  • 🖼 прозрачный или белый фон, угол поворота, при необходимости — логотип в центре.

Если конфигурация построена на БСП (а это Бухгалтерия, ЗУП, Управление торговлей, ERP и большинство типовых), компонента уже подключена и обёрнута удобным модулем. Вручную её подключать не нужно.

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

Где QR-код уже печатается без доработок

Прежде чем писать код, проверьте — возможно, нужный QR в типовой уже есть.

Квитанции и счета на оплату. В 1С:Бухгалтерии при печати счёта или квитанции для физлица на форме выводится платёжный QR по ГОСТ. Человек наводит камеру банковского приложения — реквизиты подставляются автоматически. Искать печать счёта нужно из самого документа реализации или счёта: кнопка Печать, далее форма со счётом.

Акты, накладные, УПД. Здесь QR штатно не предусмотрен — это линейные формы. Если нужно добавить на них QR (например, ссылку на документ в учётной системе), это уже доработка макета, см. раздел про печатную форму.

Маркировка. В конфигурациях с подсистемой маркировки печатаются коды для «Честного ЗНАКа», но это DataMatrix, а не QR. Подробности — в отдельном разделе ниже.

Если готовой печати достаточно — дорабатывать ничего не нужно. Код ниже пригодится, когда QR требуется в своей форме или по своим правилам.

Генерация QR-кода в коде на встроенном языке

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

// Серверный контекст
Параметры = ГенерацияШтрихкода.ПараметрыФормированияШтрихкода();
Параметры.Штрихкод = "https://example.com/doc?id=1024";
Параметры.ТипКода  = 16;          // QR-код
Параметры.Ширина   = 150;
Параметры.Высота   = 150;
Параметры.УбратьЛишнийФон = Истина;

Результат = ГенерацияШтрихкода.ИзображениеШтрихкода(Параметры);

Если Результат.РезультатФормирования Тогда
    КартинкаQR = Результат.Картинка;  // тип Картинка — кладём в макет
Иначе
    Сообщить("Не удалось сформировать QR-код");
КонецЕсли;

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

Несколько пояснений по полям:

  • ТипКода задаёт формат двумерного кода. В текущей компоненте значение для QR — 16; проверьте в справке к компоненте, если код не рисуется;
  • УбратьЛишнийФон = Истина делает фон прозрачным — удобно, когда QR ложится на цветную подложку макета;
  • для длинного содержимого поднимайте размер картинки, иначе модули QR станут слишком мелкими для сканера.

Генерацию картинки выполняйте на сервере, а не на клиенте — так код одинаково работает в тонком и веб-клиенте, а компонента гарантированно доступна.

Что положить внутрь QR

Содержимое — обычная строка. Частые варианты:

  • 🔗 ссылка на документ или карточку товара на сайте;
  • 💳 строка платёжных реквизитов по ГОСТ (см. раздел про оплату);
  • 📄 произвольный текст — артикул, серийный номер, контакт.

Для кириллицы следите за кодировкой: приёмное приложение должно уметь её прочитать. Ссылки и латиница проблем не вызывают.

Сохранить QR в файл, а не в макет

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

// КартинкаQR получена выше
ДвоичныеДанные = КартинкаQR.ПолучитьДвоичныеДанные();
ДвоичныеДанные.Записать("C:\Temp\qr.png");

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

Как добавить QR-код в печатную форму (макет)

Картинка сама по себе бесполезна — её нужно вывести в табличный документ. Порядок такой:

  1. Откройте макет печатной формы в конфигураторе (или в расширении, если правка типовой запрещена).
  2. Добавьте в макет область с рисунком: вставьте объект типа Рисунок, задайте ему имя, например QRКод.
  3. В модуле печати, после формирования картинки, присвойте рисунку изображение и выведите область в табличный документ.
Макет = ПолучитьОбщийМакет("МойМакетСчета");
Область = Макет.ПолучитьОбласть("Шапка");

// КартинкаQR получена в примере выше
Область.Рисунки.QRКод.Картинка = КартинкаQR;

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

Размер рисунка в макете и размер сгенерированной картинки задавайте согласованно. Если область рисунка маленькая, а картинка крупная, QR сожмётся и может потерять читаемость. Оптимально — соотношение сторон 1:1 (квадрат).

Проверяйте результат на печати или в предпросмотре: наведите камеру телефона на экран. Если код не считывается — увеличьте размер, поднимите уровень коррекции ошибок или уберите логотип из центра.

Внешние обработки и расширения вместо правки типовой

Менять типовую конфигурацию снятием с поддержки — плохая идея: усложнятся обновления. Есть два аккуратных пути.

Внешняя обработка. Весь код генерации и вывода QR складывается во внешнюю обработку (.epf). Она подключается к документу как дополнительная печатная форма через механизм дополнительных отчётов и обработок. Типовая остаётся нетронутой, обработка живёт отдельным файлом и переносится между базами.

Расширение конфигурации . Если QR нужно встроить в существующую печать типового документа, используйте расширение. В нём можно:

  • добавить рисунок в заимствованный макет;
  • перехватить процедуру печати и дорисовать QR;
  • добавить новую команду печати рядом со штатной.

Расширение подключается без снятия конфигурации с поддержки и переживает обновления (при условии, что изменённые объекты не конфликтуют с новой версией типовой).

Какой способ выбрать для QR-кода?

QR для оплаты по ГОСТ и коды «Честного ЗНАКа» — не путать

Это два разных формата, и ошибка здесь приводит к тому, что код не читается нужным приложением.

QR для оплаты. Платёжный QR делается по ГОСТ Р 56042-2014. Внутри — текстовая строка с реквизитами, которая начинается со служебного заголовка ST00012 и содержит пары «поле=значение»: наименование получателя, расчётный счёт, БИК, корреспондентский счёт, сумма, назначение платежа.

ST00012|Name=ООО Ромашка|PersonalAcc=40702810...|BankName=Банк|BIC=044525...|CorrespAcc=30101810...|Sum=150000|Purpose=Оплата по счёту 42

Сумма (Sum) указывается в копейках. Эту строку вы и передаёте в генератор QR как содержимое. Банковское приложение распознаёт формат и подставляет реквизиты.

Коды «Честного ЗНАКа». Маркировка использует не QR, а DataMatrix — другой двумерный код. Его наносят на товар, а покупатель сканирует приложением «Честный ЗНАК». Код маркировки приходит из системы ГИС МТ (оператор — ЦРПТ) и содержит GTIN, серийный номер и криптографическую часть.

Та же компонента печати штрихкодов рисует и DataMatrix — меняется только тип кода в параметрах. Но путать форматы нельзя:

ЗадачаФорматОткуда данные
Оплата по квитанцииQR (ГОСТ Р 56042)формируете сами из реквизитов
Маркировка товараDataMatrixприходит из ГИС МТ «Честный ЗНАК»
Ссылка на документQRформируете сами

Нельзя «сгенерировать» код маркировки самостоятельно из артикула — он заказывается в системе маркировки и содержит криптозащиту. В 1С вы его печатаете, а не придумываете.

Массовая печать: как не уронить производительность

Один QR рисуется мгновенно. Проблемы начинаются на тиражах в тысячи этикеток — формирование картинок нагружает сервер.

Что помогает:

  1. 🖥 Генерируйте на сервере пакетом. Соберите список строк для кодирования и обработайте их в одном серверном вызове, а не дёргайте сервер из клиента на каждую этикетку.
  2. 🔁 Не подключайте компоненту в цикле. Подключение внешней компоненты — дорогая операция. В БСП модуль это учитывает; при прямой работе с компонентой подключайте её один раз до цикла.
  3. 🗂 Кэшируйте одинаковые коды. Если в партии повторяются одни и те же значения (например, один артикул на сто этикеток), генерируйте картинку один раз и переиспользуйте.
  4. ⏳ Большие тиражи — в фоновое задание. Печать десятков тысяч кодов выносите в фоновое задание, чтобы не блокировать сеанс пользователя.
  5. 📏 Не завышайте размер картинки. Избыточное разрешение раздувает табличный документ и память. Для этикетки обычно хватает 100–200 пикселей на сторону.

Если печать всё равно тормозит, замерьте, что именно медленно: генерация картинок или формирование самого табличного документа с тысячами областей. Часто узкое место — второе, и его лечат упрощением макета.

Диагностика: выберите симптом

Частые вопросы

Нужна ли отдельная библиотека или платный модуль, чтобы рисовать QR?
Нет. Компонента печати штрихкодов входит в платформу 1С:Предприятие 8.3 и поддерживает QR. Сторонние библиотеки для типовой задачи не нужны.
Можно ли сформировать QR на сервере под Linux?
Да. Компонента поставляется в native-варианте и работает на серверах под Linux. Генерацию картинки выполняйте в серверном контексте.
Чем QR отличается от DataMatrix и почему это важно?
Это разные двумерные коды. Оплата и ссылки — QR; маркировка «Честного ЗНАКа» — DataMatrix. Приложение ждёт конкретный формат, поэтому подмена одного другим приводит к нечитаемому коду.
Как добавить QR в типовой счёт, не снимая конфигурацию с поддержки?
Через расширение (заимствуете макет и дорисовываете рисунок) или через внешнюю обработку как дополнительную печатную форму. Типовая при этом не меняется.
Что положить внутрь QR-кода?
Любую строку: ссылку на документ, текст, платёжные реквизиты по ГОСТ. Для оплаты строка должна начинаться с заголовка ST00012 и содержать обязательные поля.

Источники

  • ГОСТ Р 56042-2014 «Стандарты финансовых операций. QR-коды для платежей»