Как убрать лишние поля и растянуть QR-код на всю область картинки в 1С

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Торговля и дистрибуция
← На главную

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

Анализ проблемы формирования изображения компонентой

Для начала разберем типичную ситуацию: используется стандартная библиотека подключаемого оборудования (БПО) или ее части, встроенные в старые конфигурации (например, УТ 10.3). Проблема заключается в том, что внешняя компонента Barcode (ее Native-вариант) генерирует «тихую зону» (quiet zone) вокруг кода. Согласно стандартам ISO, QR-код должен иметь отступ в 4 модуля (точки) со всех сторон для корректного считывания. Однако иногда эти отступы становятся непропорционально большими относительно заданных размеров Ширина и Высота.

Рассмотрим структуру параметров, которая обычно передается в функцию получения картинки:


ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Высота", 250); // Размер в пикселях
ПараметрыШтрихкода.Вставить("Ширина", 250);
ПараметрыШтрихкода.Вставить("ТипКода", 16); // 16 соответствует QR-коду
ПараметрыШтрихкода.Вставить("Штрихкод", СокрЛП(ТекстШК));
ПараметрыШтрихкода.Вставить("ПрозрачныйФон", Истина);
ПараметрыШтрихкода.Вставить("УровеньКоррекцииQR", 1); // M (средний)
ПараметрыШтрихкода.Вставить("Масштабировать", Истина);
ПараметрыШтрихкода.Вставить("СохранятьПропорции", Ложь);
ПараметрыШтрихкода.Вставить("УбратьЛишнийФон", Истина);

Как мы видим, автор пытается управлять размером, задавая конкретные значения ширины и высоты. Однако, если компонента считает, что при таких размерах код должен быть маленьким, она просто «дорисует» пустоту вокруг него.

Решение 1: Программная настройка параметров компоненты

Для того чтобы картинка занимала максимум пространства, необходимо правильно инициализировать объект внешней компоненты. Проанализируем функцию ПолучитьКартинкуШтрихкода. Основной фокус здесь — правильное соотношение логических пикселей и физического размера области в макете.

Шаг 1. Расчет размеров. Вместо фиксированных значений (например, 250х250) лучше рассчитывать размеры динамически, исходя из параметров рисунка в макете, умноженных на коэффициент четкости (например, 5 или 10). Это позволит получить изображение высокого разрешения, которое при сжатии в табличном документе даст четкие границы.


КоэффициентЧеткости = 5;
ВнешняяКомпонента.Ширина = Окр(Рисунок.Ширина / КоличествоМиллиметровВПикселе * КоэффициентЧеткости);
ВнешняяКомпонента.Высота = Окр(Рисунок.Высота / КоличествоМиллиметровВПикселе * КоэффициентЧеткости);

Шаг 2. Отключение автоматических настроек. Важно явно указывать АвтоТип = Ложь, чтобы компонента не пыталась сама подобрать оптимальный (по ее мнению) формат, который может привести к увеличению полей.

Шаг 3. Управление коррекцией ошибок. Параметр УровеньКоррекцииQR (0-L, 1-M, 2-Q, 3-H) напрямую влияет на плотность точек. Если код слишком «разреженный» и вокруг него много места, попробуйте изменить уровень коррекции на 0 (минимальный) или 3 (максимальный). Это изменит количество модулей в коде и может заставить компоненту пересчитать границы плотнее.

Решение 2: Трюки с макетом и табличным документом

Если программная настройка параметров Ширина и Высота не дает желаемого эффекта (поля остаются), можно воспользоваться методом «от противного», который часто применяется в 1С 8.3 на обычных формах.

  1. Отрицательные поля. В свойствах области табличного документа, где выводится QR-код, можно попробовать установить минимальные или даже отрицательные отступы (если это позволяет драйвер принтера или виртуальный принтер).
  2. Свойство «Размер картинки». Для объекта Рисунок в макете следует установить значение Пропорционально. Несмотря на то что многие советуют Растянуть, для QR-кодов это критично: при растягивании нарушаются пропорции квадратов (модулей), что делает код нечитаемым. Чтобы код «растянулся» сам, нужно, чтобы исходная картинка, возвращаемая компонентой, была максимально большой.
  3. Масштабирование в макете. Если картинка все равно маленькая, попробуйте увеличить физический размер области в макете за границы ячеек. При печати 1С масштабирует содержимое ячеек, и если картинка будет «вылезать», она может занять больше пространства.

Решение 3: Обновление версии компоненты

Проанализируем ситуацию с версиями. В старых версиях компоненты 1С (до 9.0.1.х) действительно существовал баг, из-за которого QR-код всегда рисовался с огромными белыми рамками, которые невозможно было убрать программно. Выясним, как это исправить:

Нужно найти актуальную версию компоненты Barcode_9.0.10.5 (или выше) из состава актуальной БПО. Чтобы проверить версию, которую используете вы, можно извлечь файл из общего макета КомпонентаПечатиШтрихкодов (сохранить как zip-архив) и посмотреть информацию в манифесте. Если версия старая — замените ее. Новые версии корректно отрабатывают параметры УбратьЛишнийФон и Масштабировать.

Особенности использования параметров прозрачности

Интересный нюанс: использование параметра ПрозрачныйФон = Истина иногда конфликтует с алгоритмом обрезки полей в самой компоненте. Рассмотрим логику:

Когда включена прозрачность, компонента формирует альфа-канал. В некоторых реализациях Native API это приводит к тому, что функция обрезки лишнего белого фона просто игнорируется, так как фона «как бы нет». Попробуйте установить ПрозрачныйФон = Ложь. В этом случае компонента увидит границы черных модулей на белом фоне и сможет корректно применить параметр УбратьЛишнийФон.

Полный пример кода для качественной генерации

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


Функция ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода) Экспорт
    ВнешняяКомпонента = ПодключитьВнешнююКомпонентуПечатиШтрихкода();
    Если ВнешняяКомпонента = Неопределено Тогда
        Возврат Неопределено;
    КонецЕсли;

    // Задаем размеры с запасом для четкости
    ВнешняяКомпонента.Ширина = Окр(ПараметрыШтрихкода.Ширина);
    ВнешняяКомпонента.Высота = Окр(ПараметрыШтрихкода.Высота);
    ВнешняяКомпонента.ТипКода = 16; // QR
    
    // Обязательно передаем текст до вызова методов формирования
    ВнешняяКомпонента.ЗначениеКода = ПараметрыШтрихкода.Штрихкод;
    
    // Уровни коррекции: 0-L, 1-M, 2-Q, 3-H
    ВнешняяКомпонента.УровеньКоррекцииQR = 1; 
    
    // Эти параметры отвечают за растяжение
    ВнешняяКомпонента.Масштабировать = Истина;
    ВнешняяКомпонента.СохранятьПропорции = Истина; // Для QR лучше Истина
    
    // Пытаемся заставить компоненту убрать поля
    Попытка
        ВнешняяКомпонента.УбратьЛишнийФон = Истина;
    Исключение
        // Параметр может не поддерживаться старой версией
    КонецПопытки;

    ДвоичныеДанныеКартинки = ВнешняяКомпонента.ПолучитьШтрихкод();
    Если ДвоичныеДанныеКартинки <> Неопределено Тогда
        Возврат Новый Картинка(ДвоичныеДанныеКартинки);
    КонецЕсли;

    Возврат Неопределено;
КонецФункции

Выводы и рекомендации

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

Использование вышеперечисленных методов в совокупности позволит вам добиться того, чтобы QR-код занимал все отведенное ему место в чеке, этикетке или счете, обеспечивая при этом высокую скорость и надежность считывания сканерами.

← На главную