Как сформировать и вывести QR-код в макет 1С:Предприятие 8.3

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

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

Способ 1: Использование внешней компоненты из состава БСП

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

Проанализируем пример кода для формирования картинки:


// Получаем макет и область, куда будем выводить код
Макет = Обработки.ПечатьQR.ПолучитьМакет("МакетQRКод");
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьШтрихкода");

// Добавляем пустую картинку в коллекцию рисунков макета
штрихКод = ОбластьМакета.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);

// Подключаем внешнюю компоненту
ГенераторQRКода = ОбщегоНазначения.ПодключитьКомпонентуИзМакета("QRCodeExtension", "ОбщийМакет.КомпонентаПечатиQRКода");

// Генерируем двоичные данные картинки
// Параметры: Текст, Уровень коррекции (0-3), Размер (в пикселях)
ДвоичныеДанныеКартинки = ГенераторQRКода.GenerateQRCode("ВАШ ТЕКСТ ДЛЯ КОДИРОВАНИЯ", 2, 300);

// Создаем объект Картинка и помещаем его в макет
Картинка = Новый Картинка(ДвоичныеДанныеКартинки);
штрихКод.Картинка = Картинка;

// Задаем координаты расположения в макете
штрихКод.Расположить(ОбластьМакета.Область("R1C1:R5C5"));
штрихКод.РазмерКартинки = РазмерКартинки.Пропорционально;

В данном примере важно обратить внимание на метод GenerateQRCode. Второй параметр (уровень коррекции ошибок) определяет, насколько код будет устойчив к повреждениям. Значение 2 (уровень Q) позволяет восстановить до 25% данных при частичном затирании кода на этикетке.

Способ 2: Точная настройка размеров и борьба с искажениями

Часто программисты сталкиваются с проблемой, когда QR-код плохо считывается из-за неправильного масштабирования. Если свойство РазмерКартинки установлено в значение Пропорционально, платформа может "размыть" пиксели штрихкода. Выясним причину: штрихкоды чувствительны к физическому размеру "модуля" (черного квадрата). Чтобы избежать проблем, рекомендуется рассчитывать размер программно.

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


// Определяем размер рисунка в макете (в мм)
РазмерРисунка_мм = Мин(ОбластьМакета.Рисунки.QR_код.Высота, ОбластьМакета.Рисунки.QR_код.Ширина);

// Коэффициент перевода мм в пиксели (зависит от DPI, обычно около 3.78)
КоэффициентПеревода = 3.77952755; 
РазмерРисунка_пикс = Цел(РазмерРисунка_мм * КоэффициентПеревода);

// Формируем данные через вспомогательную функцию
ДвоичныеДанные = ПолучитьДанныеQR(ТекстКода, РазмерРисунка_пикс);

Если ДвоичныеДанные <> Неопределено Тогда
    ОбластьМакета.Рисунки.QR_код.Картинка = Новый Картинка(ДвоичныеДанные, Истина);
    // Устанавливаем реальный размер, чтобы избежать интерполяции
    ОбластьМакета.Рисунки.QR_код.РазмерКартинки = РазмерКартинки.РеальныйРазмер;
КонецЕсли;

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

Способ 3: Встроенные средства платформы (начиная с 8.3.16)

Если ваша платформа обновлена до версии 8.3.16 или выше, можно отказаться от внешних компонент. В платформу встроен объект ГрафическийОбъектШтрихкод. Посмотрим на этот современный подход, который работает быстрее и стабильнее.

Для реализации этого метода выполним следующие действия:

  1. В макете табличного документа выберем меню Таблица — Рисунки — Вставить штрихкод.
  2. В свойствах появившегося объекта установим тип кода: QR.
  3. Дадим рисунку имя, например, МойQRКод.

Теперь мы можем обращаться к нему напрямую из кода 1С:


Область = Макет.ПолучитьОбласть("Заголовок");
// Обращаемся к объекту внутри рисунка
РисунокQR = Область.Рисунки.МойQRКод.Объект;
РисунокQR.Текст = "https://mysite.ru/order/123";
РисунокQR.ТипКода = ТипШтрихкода.QR;
// Можно также настроить уровень коррекции ошибок
РисунокQR.УровеньКоррекцииОшибок = 2; 

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

Этот способ является наиболее предпочтительным, так как он кроссплатформенный (работает и на Windows, и на Linux) и не требует регистрации дополнительных DLL-файлов на сервере или клиенте.

Важные нюансы при работе с QR-кодами

Проанализируем несколько критических моментов, о которых часто забывают начинающие разработчики:

  1. Кодировка текста: QR-код чувствителен к кодировке. Если вы кодируете кириллицу, внешняя компонента может выдать ошибку или нечитаемый код на мобильном телефоне. Всегда старайтесь передавать строку в формате UTF-8. В некоторых случаях может потребоваться преобразование строки в двоичные данные с явным указанием кодировки перед передачей в генератор.
  2. "Свободная зона" (Quiet Zone): Вокруг QR-кода обязательно должна быть белая рамка шириной минимум в 4 модуля. Не прижимайте рисунок вплотную к границам ячеек или рамкам макета, иначе сканер не сможет "захватить" код.
  3. Плотность данных: Чем больше текста вы пытаетесь "запихнуть" в один код, тем меньше становятся его элементы. Если текста слишком много, а физический размер картинки в макете мал (например, 10х10 мм), сканеры не смогут его распознать. Старайтесь сокращать ссылки (используя редиректы) или передавать только необходимые идентификаторы.
  4. Особенности Linux: Если сервер 1С работает под управлением ОС Linux, внешние компоненты в формате .dll работать не будут. В этом случае необходимо использовать либо встроенные средства платформы (Способ 3), либо Native API компоненты (файлы .so).

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

← На главную