При формировании ценников, этикеток или документов с QR-кодами разработчики часто сталкиваются с проблемой избыточно больших белых полей (так называемой «зоны молчания» или quiet zone) вокруг самого штрихкода. Эти поля могут нарушать дизайн макета, уменьшать полезную площадь печати и усложнять компоновку элементов. В этой статье мы подробно разберем, как решить эту проблему различными методами: при использовании облачного сервиса Google Charts API, при работе с локальной консольной утилитой Zint, а также с помощью современных встроенных средств платформы 1С.
Если в вашей конфигурации генерация QR-кода реализована через отправку запросов к сервису Google Charts API, размер белых полей можно регулировать с помощью специального параметра chld.
Параметр chld является составным и принимает значение в формате <уровень_коррекции>|<размер_полей>. Давайте проанализируем его структуру подробнее:
L — восстановление до 7% утерянных данных (используется по умолчанию, обеспечивает наименьшую плотность точек).M — восстановление до 15% данных.Q — восстановление до 25% данных.H — восстановление до 30% данных (максимальная избыточность, код становится более плотным).4. Для уменьшения полей мы можем передать значение 1 или полностью убрать рамку, передав 0.Рассмотрим пример формирования GET-запроса. Если мы хотим сгенерировать QR-код с минимальными полями в 1 модуль и стандартным уровнем коррекции ошибок, наш URL-запрос должен включать параметр: &chld=L|1.
Важный нюанс кодирования в 1С: символ вертикальной черты (|) является служебным для HTTP-протокола. Если передавать его в сыром виде, сервер вернет ошибку или проигнорирует параметр. В коде 1С необходимо обязательно экранировать этот символ, заменив его на шестнадцатеричный код %7C. Таким образом, параметр в строке запроса должен выглядеть так: &chld=L%7C1 или &chld=L%7C0 для полного отключения полей.
Давайте посмотрим на практический пример формирования ссылки для загрузки картинки QR-кода с уменьшенными полями:
Функция ПолучитьСсылкаНаQRКодGoogle(ЗначениеКода, ШиринаИВысотаПикселей) Экспорт
// Экранируем спецсимволы в кодируемом тексте
ТекстКодаЭскейп = КодироватьСтроку(ЗначениеКода, СпособКодированияСтроки.URLКодирование);
// Собираем базовый URL Google Charts API
БазовыйURL = "https://chart.googleapis.com/chart?";
// Добавляем обязательные параметры:
// cht=qr (тип диаграммы - QR-код)
// chs (размер картинки в пикселях, например, 150x150)
// chl (кодируемый текст)
// chld=L%7C1 (уровень коррекции L, поля шириной в 1 модуль)
ПараметрыЗапроса = "cht=qr"
+ "&chs=" + Формат(ШиринаИВысотаПикселей, "ЧГ=0") + "x" + Формат(ШиринаИВысотаПикселей, "ЧГ=0")
+ "&chl=" + ТекстКодаЭскейп
+ "&chld=L%7C1"; // уменьшаем поля до 1 модуля
Возврат БазовыйURL + ПараметрыЗапроса;
КонецФункции
Несмотря на кажущуюся простоту реализации интеграции с Google Charts API, мы настоятельно рекомендуем отказаться от этого способа в коммерческих решениях по следующим важным причинам:
Если вам все же необходим облачный генератор, рассмотрите более современные и стабильные альтернативы (например, QuickChart или goQR.me), которые поддерживают аналогичный синтаксис параметров для управления полями.
Начиная с современных версий платформы 1С:Предприятие 8.3 и Библиотеки стандартных подсистем (БСП), разработчикам больше не требуются внешние веб-сервисы, компоненты или сторонние шрифты. Платформа умеет генерировать QR-коды полностью локально, на стороне сервера 1С.
Для генерации используется общий модуль БСП ГенерацияШтрихкода. Давайте разберем, как получить картинку QR-кода напрямую в коде:
// Пример генерации QR-кода средствами БСП без использования интернета
ТекстДляКодирования = "https://mysite.ru/product/12345";
ШиринаКартинки = 200; // в пикселях
ВысотаКартинки = 200;
// Вызываем метод БСП, возвращающий двоичные данные картинки
ДанныеКартинки = ГенерацияШтрихкода.ДанныеQRКода(ТекстДляКодирования, 0, ШиринаКартинки, "L");
Если ДанныеКартинки <> Неопределено Тогда
// Создаем объект Картинка из двоичных данных
КартинкаQR = Новый Картинка(ДанныеКартинки);
// Теперь эту картинку можно вывести в макет табличного документа или на форму
КонецЕсли;
Преимущество этого метода очевидно: он работает мгновенно, полностью локально, не зависит от доступности внешних сайтов и идеально поддерживает любые символы, включая кириллицу.
Если вы работаете в режиме совместимости со старыми версиями платформы (например, 8.2) и не можете использовать современные механизмы БСП, отличной альтернативой является бесплатная консольная утилита Zint. Она запускается на сервере или клиенте локально и генерирует файлы изображений штрихкодов.
Разберем, как управлять полями и кодировкой при интеграции с Zint:
--whitespace (или сокращенная версия -w). Значение задается в модулях кода. Чтобы минимизировать рамку, передайте ключ -w 1 или полностью отключите ее с помощью -w 0.ЗапуститьПриложение), кодировка символов повредится. Это связано с тем, что командный интерпретатор Windows использует кодировку OEM (CP866), сама 1С работает в UTF-16, а утилита Zint ожидает данные в кодировке UTF-8.
Правильное решение: Записывать кодируемый текст во временный файл в кодировке UTF-8 без BOM, а затем передавать этот файл в Zint с помощью ключа -i (входной файл).
Проанализируем комплексный пример кода 1С, реализующий выгрузку текста во временный файл, запуск утилиты Zint с минимальными полями и последующую загрузку картинки обратно в систему:
Процедура СгенерироватьQRКодЧерезZint(ТекстКода, ПутьКУтилитеZint, ПутьКФайлуКартинки)
// 1. Создаем временный файл для передачи текста в правильной кодировке
ПутьКВременномуФайлу = ПолучитьИмяВременногоФайла("txt");
// Записываем текст в файл UTF-8 без BOM
ЗаписьТекста = Новый ЗаписьТекста(ПутьКВременномуФайлу, КодировкаТекста.UTF8, , , Ложь);
ЗаписьТекста.ЗаписатьСтроку(ТекстКода);
ЗаписьТекста.Закрыть();
// 2. Формируем параметры запуска Zint
// -b 58 : тип штрихкода QR-код
// -i : путь к входному текстовому файлу
// -o : путь к выходному изображению (.png)
// -w 1 : задаем минимальную ширину белых полей в 1 модуль
ПараметрыЗапуска = СтрШаблон("-b 58 -i ""%1"" -o ""%2"" -w 1",
ПутьКВременномуФайлу,
ПутьКФайлуКартинки);
СтрокаЗапуска = """" + ПутьКУтилитеZint + """ " + ПараметрыЗапуска;
// 3. Запускаем утилиту в синхронном режиме (ожидаем завершения)
ЗапуститьПриложение(СтрокаЗапуска, , Истина);
// Удаляем временный текстовый файл после генерации
Попытка
УдалитьФайлы(ПутьКВременномуФайлу);
Исключение
// Игнорируем ошибку удаления временного файла
КонецПопытки;
КонецПроцедуры
Этот подход гарантирует стабильное качество генерации, полное отсутствие проблем с русскими буквами и позволяет гибко управлять размерами рамки штрихкода на любых версиях платформы 1С.