В процессе разработки печатных форм в 1С часто возникает ситуация, когда сформированный QR-код (или линейный штрихкод) занимает лишь небольшую центральную часть отведенного под него прямоугольника. Даже если в макете 1С объект Рисунок настроен на заполнение всей области, внешняя компонента печати может возвращать изображение с огромными белыми полями по краям. В этой статье мы подробно разберем, как программно управлять параметрами формирования изображения, проанализируем настройки внешней компоненты Native API и выясним, как добиться максимального заполнения области макета.
Для начала разберем типичную ситуацию: используется стандартная библиотека подключаемого оборудования (БПО) или ее части, встроенные в старые конфигурации (например, УТ 10.3). Проблема заключается в том, что внешняя компонента Barcode (ее Native-вариант) генерирует «тихую зону» (quiet zone) вокруг кода. Согласно стандартам ISO, QR-код должен иметь отступ в 4 модуля (точки) со всех сторон для корректного считывания. Однако иногда эти отступы становятся непропорционально большими относительно заданных размеров Ширина и Высота.
Рассмотрим структуру параметров, которая обычно передается в функцию получения картинки:
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Высота", 250); // Размер в пикселях
ПараметрыШтрихкода.Вставить("Ширина", 250);
ПараметрыШтрихкода.Вставить("ТипКода", 16); // 16 соответствует QR-коду
ПараметрыШтрихкода.Вставить("Штрихкод", СокрЛП(ТекстШК));
ПараметрыШтрихкода.Вставить("ПрозрачныйФон", Истина);
ПараметрыШтрихкода.Вставить("УровеньКоррекцииQR", 1); // M (средний)
ПараметрыШтрихкода.Вставить("Масштабировать", Истина);
ПараметрыШтрихкода.Вставить("СохранятьПропорции", Ложь);
ПараметрыШтрихкода.Вставить("УбратьЛишнийФон", Истина);
Как мы видим, автор пытается управлять размером, задавая конкретные значения ширины и высоты. Однако, если компонента считает, что при таких размерах код должен быть маленьким, она просто «дорисует» пустоту вокруг него.
Для того чтобы картинка занимала максимум пространства, необходимо правильно инициализировать объект внешней компоненты. Проанализируем функцию ПолучитьКартинкуШтрихкода. Основной фокус здесь — правильное соотношение логических пикселей и физического размера области в макете.
Шаг 1. Расчет размеров. Вместо фиксированных значений (например, 250х250) лучше рассчитывать размеры динамически, исходя из параметров рисунка в макете, умноженных на коэффициент четкости (например, 5 или 10). Это позволит получить изображение высокого разрешения, которое при сжатии в табличном документе даст четкие границы.
КоэффициентЧеткости = 5;
ВнешняяКомпонента.Ширина = Окр(Рисунок.Ширина / КоличествоМиллиметровВПикселе * КоэффициентЧеткости);
ВнешняяКомпонента.Высота = Окр(Рисунок.Высота / КоличествоМиллиметровВПикселе * КоэффициентЧеткости);
Шаг 2. Отключение автоматических настроек. Важно явно указывать АвтоТип = Ложь, чтобы компонента не пыталась сама подобрать оптимальный (по ее мнению) формат, который может привести к увеличению полей.
Шаг 3. Управление коррекцией ошибок. Параметр УровеньКоррекцииQR (0-L, 1-M, 2-Q, 3-H) напрямую влияет на плотность точек. Если код слишком «разреженный» и вокруг него много места, попробуйте изменить уровень коррекции на 0 (минимальный) или 3 (максимальный). Это изменит количество модулей в коде и может заставить компоненту пересчитать границы плотнее.
Если программная настройка параметров Ширина и Высота не дает желаемого эффекта (поля остаются), можно воспользоваться методом «от противного», который часто применяется в 1С 8.3 на обычных формах.
Рисунок в макете следует установить значение Пропорционально. Несмотря на то что многие советуют Растянуть, для QR-кодов это критично: при растягивании нарушаются пропорции квадратов (модулей), что делает код нечитаемым. Чтобы код «растянулся» сам, нужно, чтобы исходная картинка, возвращаемая компонентой, была максимально большой.Проанализируем ситуацию с версиями. В старых версиях компоненты 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-кода:
ВертикальноеВыравниваниеКода установлен в значение 2 (центр) или 1 (верх), чтобы исключить смещение кода внутри картинки.Использование вышеперечисленных методов в совокупности позволит вам добиться того, чтобы QR-код занимал все отведенное ему место в чеке, этикетке или счете, обеспечивая при этом высокую скорость и надежность считывания сканерами.