Как уменьшить размер QR-кода в 1С 7.7 и исправить ошибку с перечеркнутым квадратом?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Выясняем причину: почему появляется белый перечеркнутый квадрат?

Для начала проанализируем внутреннее устройство генераторов штрихкодов. Большинство внешних компонент для 1С 7.7, включая популярную библиотеку Ocvita Barcode ActiveX, работают на базе открытого движка Zint. Перечеркнутый прямоугольник — это встроенный защитный механизм компоненты. Он сигнализирует о том, что программа не может уместить заданный объем информации в выделенные физические границы графического объекта на печатной форме.

Когда мы пытаемся закодировать около 200 символов текста (например, длинную платежную ссылку СБП или реквизиты платежа по ГОСТ) и при этом сжимаем картинку на макете до размеров 2.5 х 2.5 см, компонента сталкивается со следующими ограничениями:

Рассмотрим по шагам, как обойти эти ограничения и добиться стабильного вывода и чтения мелкого QR-кода.

Шаг 1: Оптимизация и сжатие кодируемых данных

Самый простой и эффективный способ уменьшить физический размер QR-кода — сократить объем передаваемой в него информации. Чем меньше символов мы кодируем, тем более низкую версию матрицы использует алгоритм, и тем крупнее будут отдельные пиксели кода при том же общем размере картинки.

Проанализируем структуру передаваемых данных. Если вы формируете платежную ссылку, постарайтесь исключить из нее избыточные параметры. Помните, что каждый символ кириллицы в кодировке UTF-8 занимает 2 байта, что мгновенно раздувает плотность кода. Если есть возможность, используйте транслитерацию, сокращайте наименования номенклатуры или контрагентов, передавая только уникальные идентификаторы (например, ID базы вместо полного ФИО).

Шаг 2: Настройка параметров компоненты Ocvita Barcode

Если объем данных сократить невозможно, необходимо принудительно перенастроить внутренние свойства ActiveX-компоненты. Рассмотрим ключевые параметры, которые помогут втиснуть код в рамки 2.5 на 2.5 см:

  1. Управление уровнем коррекции ошибок (ECC): QR-коды поддерживают избыточность данных для восстановления при повреждениях. Существует 4 уровня: L (7% восстановления), M (15%), Q (25%) и H (30%). По умолчанию компонента может использовать уровень Q или H. Для уменьшения плотности точек необходимо принудительно установить уровень L. В компоненте Ocvita за это отвечает параметр option_1. Присвоив ему значение 1, мы минимизируем избыточность, что значительно разгрузит плотность матрицы.
  2. Изменение масштаба модуля (scale): Свойство scale отвечает за масштабирование элементарной точки. Установите значение scale в пределах от 0.5 до 0.8. Это позволит компоненте использовать субпиксельную отрисовку для мелких объектов.
  3. Режим кодирования (setting_1): Если вы кодируете строго цифры или латиницу, переключите свойство setting_1 из режима автовыбора в режим жесткого соответствия типу данных. Это сэкономит служебные байты в заголовке структуры QR-кода.

Шаг 3: Использование альтернативной компоненты FormEx

Если штатная компонента Ocvita продолжает выдавать ошибку масштабирования, отличным решением будет использование популярной внешней компоненты FormEx (версии не ниже 2.0.5.131). Современные сборки FormEx умеют рисовать штрихкоды непосредственно на стандартном объекте «Картинка» печатной формы 1С 7.7.

Разберем пример кода для генерации QR-кода через FormEx:


// Создаем объект Сервис из компоненты FormEx
Сервис = СоздатьОбъект("Сервис");

// Получаем рисунок из таблицы печатной формы
// "QR_Picture" - это идентификатор объекта "Картинка" на макете
РисунокКода = Таб.Рисунки.ПолучитьИмя("QR_Picture");

// Вызываем метод генерации QR-кода (тип 58 соответствует QR-коду)
ТекстДляКодирования = "https://example.com/pay?id=12345&sum=1000";
Результат = Сервис.НарисоватьШтрихкод(РисунокКода, 58, ТекстДляКодирования);

// Очень важный нюанс масштабирования!
// Устанавливаем режим рисования "Исказить" или "Сохранить пропорции"
// Значение 3 позволяет корректно вписать сгенерированный код в рамку любого размера
РисунокКода.РежимРисования(3);

Использование метода РежимРисования(3) крайне важно. Оно заставляет платформу 1С принудительно растянуть или сжать полученное растровое изображение под физические границы рамки, заданные на макете, предотвращая появление ошибок отрисовки.

Шаг 4: Использование консольной утилиты Zint.exe

Если вам требуется абсолютный контроль над качеством генерации и параметрами сжатия, можно применить проверенный метод генерации через вызов консольной утилиты zint.exe. Этот способ исключает проблемы с регистрацией ActiveX в операционной системе и позволяет генерировать картинки во временные файлы, которые затем загружаются в макет.

Посмотрим на пример реализации данного алгоритма:


// Функция генерации файла изображения QR-кода
Функция СгенерироватьQRКод(ТекстДанных, ИмяФайла)
    
    // Путь к консольному приложению zint.exe
    ПутьКZint = КаталогИБ() + "ExtFiles\zint.exe";
    
    // Формируем параметры запуска командной строки:
    // -b 58 : тип штрихкода QR-код
    // -d    : передаваемые данные
    // -o    : выходной файл (рекомендуется использовать BMP для 1С 7.7)
    // --secure=1 : уровень коррекции ошибок L (минимальный размер)
    // --scale=1  : масштаб отрисовки модулей
    
    ПараметрыЗапуска = "-b 58 --secure=1 --scale=1 -d """ + ТекстДанных + """ -o """ + ИмяФайла + """";
    
    // Запускаем консольную утилиту в скрытом режиме с ожиданием завершения
    ФС.УдалитьФайл(ИмяФайла);
    ЗапуститьПриложение(ПутьКZint + " " + ПараметрыЗапуска, , 1);
    
    Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда
        Возврат 1;
    Иначе
        Предупреждение("Не удалось сгенерировать файл QR-кода!");
        Возврат 0;
    КонецЕсли;
    
КонецФункции

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


// Пример вывода на печать
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Счет");

ИмяВременногоИзображения = КаталогВременныхФайлов() + "qr_temp.bmp";

Если СгенерироватьQRКод(СтрокаРеквизитов, ИмяВременногоИзображения) = 1 Тогда
    // Получаем объект картинки из макета и загружаем файл
    Рисунок = Таб.Рисунки.ПолучитьИмя("ИзображениеQR");
    Рисунок.РежимРисования(3); // Включаем масштабирование
    Рисунок.Картинка.Загрузить(ИмяВременногоИзображения);
КонецЕсли;

Таб.ВывестиСекцию("Шапка");
Таб.Показать();

// Удаляем временный файл после вывода на экран
ФС.УдалитьФайл(ИмяВременногоИзображения);

Рекомендации по тестированию мелких QR-кодов

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

Применяя предложенные настройки масштабирования, оптимизацию структуры кодируемой строки и современные внешние библиотеки, вы сможете успешно разместить компактный и отлично читаемый QR-код на любых документах в системе 1С:Предприятие 7.7.

← На главную