В современной автоматизации QR-коды стали неотъемлемой частью печатных форм: они используются для ссылок на электронные документы, быстрой оплаты по реквизитам или маркировки товаров. Рассмотрим подробно, как реализовать генерацию QR-кода в системе 1С:Предприятие 8.3, начиная от использования внешних компонент и заканчивая встроенными механизмами платформы.
Для конфигураций, использующих Библиотеку стандартных подсистем (БСП), наиболее надежным методом является подключение компоненты QRCodeExtension. Разберем по шагам программный код, который позволяет создать объект QR-кода, наполнить его данными и разместить в нужном месте макета.
Проанализируем пример кода для формирования картинки:
// Получаем макет и область, куда будем выводить код
Макет = Обработки.ПечатьQR.ПолучитьМакет("МакетQRКод");
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьШтрихкода");
// Добавляем пустую картинку в коллекцию рисунков макета
штрихКод = ОбластьМакета.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
// Подключаем внешнюю компоненту
ГенераторQRКода = ОбщегоНазначения.ПодключитьКомпонентуИзМакета("QRCodeExtension", "ОбщийМакет.КомпонентаПечатиQRКода");
// Генерируем двоичные данные картинки
// Параметры: Текст, Уровень коррекции (0-3), Размер (в пикселях)
ДвоичныеДанныеКартинки = ГенераторQRКода.GenerateQRCode("ВАШ ТЕКСТ ДЛЯ КОДИРОВАНИЯ", 2, 300);
// Создаем объект Картинка и помещаем его в макет
Картинка = Новый Картинка(ДвоичныеДанныеКартинки);
штрихКод.Картинка = Картинка;
// Задаем координаты расположения в макете
штрихКод.Расположить(ОбластьМакета.Область("R1C1:R5C5"));
штрихКод.РазмерКартинки = РазмерКартинки.Пропорционально;
В данном примере важно обратить внимание на метод GenerateQRCode. Второй параметр (уровень коррекции ошибок) определяет, насколько код будет устойчив к повреждениям. Значение 2 (уровень Q) позволяет восстановить до 25% данных при частичном затирании кода на этикетке.
Часто программисты сталкиваются с проблемой, когда QR-код плохо считывается из-за неправильного масштабирования. Если свойство РазмерКартинки установлено в значение Пропорционально, платформа может "размыть" пиксели штрихкода. Выясним причину: штрихкоды чувствительны к физическому размеру "модуля" (черного квадрата). Чтобы избежать проблем, рекомендуется рассчитывать размер программно.
Рассмотрим улучшенный алгоритм, который пересчитывает миллиметры макета в пиксели компоненты:
// Определяем размер рисунка в макете (в мм)
РазмерРисунка_мм = Мин(ОбластьМакета.Рисунки.QR_код.Высота, ОбластьМакета.Рисунки.QR_код.Ширина);
// Коэффициент перевода мм в пиксели (зависит от DPI, обычно около 3.78)
КоэффициентПеревода = 3.77952755;
РазмерРисунка_пикс = Цел(РазмерРисунка_мм * КоэффициентПеревода);
// Формируем данные через вспомогательную функцию
ДвоичныеДанные = ПолучитьДанныеQR(ТекстКода, РазмерРисунка_пикс);
Если ДвоичныеДанные <> Неопределено Тогда
ОбластьМакета.Рисунки.QR_код.Картинка = Новый Картинка(ДвоичныеДанные, Истина);
// Устанавливаем реальный размер, чтобы избежать интерполяции
ОбластьМакета.Рисунки.QR_код.РазмерКартинки = РазмерКартинки.РеальныйРазмер;
КонецЕсли;
При использовании РазмерКартинки.РеальныйРазмер изображение выводится пиксель в пиксель, что гарантирует максимальную четкость для сканера.
Если ваша платформа обновлена до версии 8.3.16 или выше, можно отказаться от внешних компонент. В платформу встроен объект ГрафическийОбъектШтрихкод. Посмотрим на этот современный подход, который работает быстрее и стабильнее.
Для реализации этого метода выполним следующие действия:
МойQRКод.Теперь мы можем обращаться к нему напрямую из кода 1С:
Область = Макет.ПолучитьОбласть("Заголовок");
// Обращаемся к объекту внутри рисунка
РисунокQR = Область.Рисунки.МойQRКод.Объект;
РисунокQR.Текст = "https://mysite.ru/order/123";
РисунокQR.ТипКода = ТипШтрихкода.QR;
// Можно также настроить уровень коррекции ошибок
РисунокQR.УровеньКоррекцииОшибок = 2;
ТабДок.Вывести(Область);
Этот способ является наиболее предпочтительным, так как он кроссплатформенный (работает и на Windows, и на Linux) и не требует регистрации дополнительных DLL-файлов на сервере или клиенте.
Проанализируем несколько критических моментов, о которых часто забывают начинающие разработчики:
.dll работать не будут. В этом случае необходимо использовать либо встроенные средства платформы (Способ 3), либо Native API компоненты (файлы .so).Подводя итог, можно сказать, что выбор метода зависит от версии вашей платформы и требований к конфигурации. Для старых систем подойдет использование внешней компоненты с тщательным расчетом размеров, а для современных решений лучшим выбором будет использование встроенного объекта штрихкода платформы 1С.