Реализация печати QR-кодов на устаревшей платформе 1С:Предприятие 8.1 является нетривиальной задачей. Основная сложность заключается в том, что современные компоненты от фирмы «1С» и сторонних разработчиков чаще всего создаются с использованием технологии NativeAPI, которую версия 8.1 полноценно не поддерживает. В те времена основным стандартом взаимодействия были технологии COM и ActiveX. В этой статье мы подробно разберем несколько проверенных способов внедрения QR-кодирования в конфигурации на базе 8.1, проанализируем их плюсы и минусы, а также изучим программные примеры реализации.
Одним из самых надежных и бесплатных способов является использование генератора штрихкодов Zint. Поскольку это внешнее приложение, нам не нужно регистрировать сложные библиотеки в реестре Windows, достаточно вызвать исполняемый файл с нужными параметрами. Рассмотрим этот процесс подробнее.
Суть метода заключается в том, что 1С формирует текстовую строку, вызывает zint.exe, которая сохраняет изображение QR-кода во временный файл, а затем 1С загружает эту картинку в макет отчета. Разберем программную реализацию:
// Определим пути к утилите и временному файлу
ПутьКZint = "C:\Zint\zint.exe";
ПутьККартинке = КаталогВременныхФайлов() + "qrcode.png";
ТекстДляКодирования = "https://example.com/check/12345";
// Формируем строку запуска для консоли
// -o определяет путь к выходному файлу, -d — данные для кодирования
// --barcode=58 указывает на тип QR-код
СтрокаЗапуска = """" + ПутьКZint + """ -o """ + ПутьККартинке + """ -b 58 -d """ + ТекстДляКодирования + """";
// Вызываем выполнение системной команды
КомандаСистемы(СтрокаЗапуска);
// После выполнения проверяем наличие файла и загружаем его в макет
ФайлКартинки = Новый Файл(ПутьККартинке);
Если ФайлКартинки.Существует() Тогда
КартинкаQR = Новый Картинка(ПутьККартинке);
// Здесь код по выводу картинки в ТабличныйДокумент
КонецЕсли;
Преимущества: Полная бесплатность, отсутствие необходимости регистрации DLL, поддержка огромного количества форматов штрихкодов.
Если требуется более тесная интеграция без вызова внешних окон и создания временных файлов, проанализируем использование профессиональных библиотек, таких как Ocvita Barcode. Это COM-объект, который специально создавался для работы в среде 1С старых версий.
Для работы с этим методом необходимо зарегистрировать dll в системе (через regsvr32). После регистрации мы можем обращаться к компоненте напрямую из кода 1С:
Попытка
КомпонентаQR = Новый COMОбъект("OcvitaBarcode.Barcode.1");
Исключение
Сообщить("Компонента Ocvita не зарегистрирована в системе!");
Возврат;
КонецПопытки;
// Настройка параметров кода
КомпонентаQR.BarcodeType = 16; // Константа для QR-кода
КомпонентаQR.Text = "Данные для QR";
КомпонентаQR.Width = 300;
КомпонентаQR.Height = 300;
// Получение картинки напрямую или сохранение
КомпонентаQR.SaveToFile(КаталогВременныхФайлов() + "qr.bmp");
Этот метод считается наиболее "чистым" с точки зрения программирования, так как мы работаем с объектом внутри памяти приложения.
Существует интересное решение, позволяющее использовать современные компоненты, предназначенные для 1С 8.2 и 8.3, в среде 8.1. Для этого применяется специальная "обертка" (враппер), которая транслирует вызовы COM в NativeAPI. Это позволяет взять стандартную компоненту 1CBarCode из последних версий БП или УТ и запустить ее на 8.1.
Рассмотрим ситуацию: у нас есть макет от версии 8.2, где внутри лежит ZIP-архив с компонентой. Нам нужно извлечь файл .dll, зарегистрировать его через враппер и обращаться к нему как к обычному COM-объекту через Новый COMОбъект.
Если на компьютерах пользователей есть стабильный доступ в интернет, мы можем переложить задачу генерации кода на внешние сервисы. Проанализируем, как отправить запрос и получить результат, используя объект HTTPСоединение.
Выясним последовательность действий:
URL с параметрами кодирования (текст, размер, уровень коррекции ошибок).HTTPСоединение для отправки GET-запроса.
Сервер = "api.qrserver.com";
Ресурс = "/v1/create-qr-code/?size=150x150&data=" + СокрЛП(ТекстКода);
Соединение = Новый HTTPСоединение(Сервер);
ВременныйФайл = ПолучитьИмяВременногоФайла("png");
Попытка
Соединение.Получить(Ресурс, ВременныйФайл);
КартинкаОбъект = Новый Картинка(ВременныйФайл);
// Вывод в табличный документ
Исключение
Сообщить("Ошибка связи с сервером генерации QR-кода");
КонецПопытки;
Важный момент: При использовании этого метода данные передаются на сторонний сервер. Если вы кодируете конфиденциальную информацию (например, персональные данные или ключи доступа), этот метод может быть неприемлем по соображениям безопасности.
Платформа 8.1 поддерживает элемент управления Поле HTML-документа. Мы можем поместить на форму или в скрытую область макета HTML-код, содержащий JavaScript-библиотеку (например, qrcode.js). Библиотека сгенерирует SVG или Canvas с кодом, который затем можно извлечь или распечатать.
Разберем, как это работает: 1С передает текст в функцию JS, скрипт отрисовывает код в браузере (движок IE, встроенный в Windows), и мы получаем готовое изображение. Плюс этого метода в том, что он полностью автономен и не требует регистрации внешних DLL в реестре системы, что часто запрещено политиками безопасности в крупных организациях.
Выбор конкретного пути зависит от ваших условий эксплуатации:
ActiveX-компоненты.При выводе QR-кода в печатную форму помните, что размер картинки должен быть достаточным для считывания сканером (обычно не менее 20x20 мм), а вокруг кода обязательно должна быть "тихая зона" (белое поле) шириной в несколько модулей самого кода. Проанализируйте настройки масштабирования рисунка в макете 1С: лучше всего использовать режим Реальный размер или Пропорционально, чтобы избежать искажения геометрии квадратов кода.