Как уменьшить белые поля вокруг QR-кода при его генерации в 1С?

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

При формировании ценников, этикеток или документов с QR-кодами разработчики часто сталкиваются с проблемой избыточно больших белых полей (так называемой «зоны молчания» или quiet zone) вокруг самого штрихкода. Эти поля могут нарушать дизайн макета, уменьшать полезную площадь печати и усложнять компоновку элементов. В этой статье мы подробно разберем, как решить эту проблему различными методами: при использовании облачного сервиса Google Charts API, при работе с локальной консольной утилитой Zint, а также с помощью современных встроенных средств платформы 1С.

Решение проблемы при использовании Google Charts API

Если в вашей конфигурации генерация QR-кода реализована через отправку запросов к сервису Google Charts API, размер белых полей можно регулировать с помощью специального параметра chld.

Параметр chld является составным и принимает значение в формате <уровень_коррекции>|<размер_полей>. Давайте проанализируем его структуру подробнее:

  1. Уровень коррекции ошибок (Error Correction Level): определяет избыточность кодируемой информации для успешного сканирования даже при частичном повреждении или загрязнении кода.
    • L — восстановление до 7% утерянных данных (используется по умолчанию, обеспечивает наименьшую плотность точек).
    • M — восстановление до 15% данных.
    • Q — восстановление до 25% данных.
    • H — восстановление до 30% данных (максимальная избыточность, код становится более плотным).
  2. Ширина полей (Margin): целое число, указывающее ширину рамки в модулях (эквивалентно ширине одной минимальной точки или «строки» QR-кода). По умолчанию этот параметр равен 4. Для уменьшения полей мы можем передать значение 1 или полностью убрать рамку, передав 0.

Рассмотрим пример формирования GET-запроса. Если мы хотим сгенерировать QR-код с минимальными полями в 1 модуль и стандартным уровнем коррекции ошибок, наш URL-запрос должен включать параметр: &chld=L|1.

Важный нюанс кодирования в 1С: символ вертикальной черты (|) является служебным для HTTP-протокола. Если передавать его в сыром виде, сервер вернет ошибку или проигнорирует параметр. В коде 1С необходимо обязательно экранировать этот символ, заменив его на шестнадцатеричный код %7C. Таким образом, параметр в строке запроса должен выглядеть так: &chld=L%7C1 или &chld=L%7C0 для полного отключения полей.

Пример кода формирования запроса в 1С

Давайте посмотрим на практический пример формирования ссылки для загрузки картинки 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 + ПараметрыЗапроса;
КонецФункции

Риски использования внешних облачных API

Несмотря на кажущуюся простоту реализации интеграции с Google Charts API, мы настоятельно рекомендуем отказаться от этого способа в коммерческих решениях по следующим важным причинам:

  1. Устаревание сервиса (Deprecated status): Сервис Google Image Charts был официально объявлен устаревшим компанией Google еще в 2012 году. В любой момент поддержка может прекратиться без предварительного уведомления.
  2. Блокировки и безопасность данных: Доступ к серверам Google может быть заблокирован регуляторами или внутренними службами информационной безопасности вашей компании (системными администраторами), которые часто закрывают доступ к внешним ресурсам для серверов 1С с целью защиты коммерческой тайны.
  3. Зависимость от интернет-соединения: Если на складе или в торговой точке пропадет интернет, печать ценников или этикеток полностью остановится, что может привести к значительным финансовым потерям.

Если вам все же необходим облачный генератор, рассмотрите более современные и стабильные альтернативы (например, QuickChart или goQR.me), которые поддерживают аналогичный синтаксис параметров для управления полями.

Генерация QR-кода нативными средствами 1С (через БСП)

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

Для генерации используется общий модуль БСП ГенерацияШтрихкода. Давайте разберем, как получить картинку QR-кода напрямую в коде:


// Пример генерации QR-кода средствами БСП без использования интернета
ТекстДляКодирования = "https://mysite.ru/product/12345";
ШиринаКартинки = 200; // в пикселях
ВысотаКартинки = 200;

// Вызываем метод БСП, возвращающий двоичные данные картинки
ДанныеКартинки = ГенерацияШтрихкода.ДанныеQRКода(ТекстДляКодирования, 0, ШиринаКартинки, "L");

Если ДанныеКартинки <> Неопределено Тогда
    // Создаем объект Картинка из двоичных данных
    КартинкаQR = Новый Картинка(ДанныеКартинки);
    // Теперь эту картинку можно вывести в макет табличного документа или на форму
КонецЕсли;

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

Использование локальной утилиты Zint и тонкости настройки

Если вы работаете в режиме совместимости со старыми версиями платформы (например, 8.2) и не можете использовать современные механизмы БСП, отличной альтернативой является бесплатная консольная утилита Zint. Она запускается на сервере или клиенте локально и генерирует файлы изображений штрихкодов.

Разберем, как управлять полями и кодировкой при интеграции с Zint:

  1. Управление белыми полями: За ширину рамки в Zint отвечает параметр --whitespace (или сокращенная версия -w). Значение задается в модулях кода. Чтобы минимизировать рамку, передайте ключ -w 1 или полностью отключите ее с помощью -w 0.
  2. Решение проблемы с кириллицей: Если передавать русский текст напрямую в параметрах командной строки (через метод ЗапуститьПриложение), кодировка символов повредится. Это связано с тем, что командный интерпретатор 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С.

← На главную