При печати этикеток на специализированных термопринтерах (например, XPrinter, Zebra) пользователи и разработчики часто сталкиваются с проблемой: на предварительном просмотре штрихкод выглядит корректно, однако на физической этикетке он получается сильно сжатым по ширине и не распознается сканером. Проанализируем физику работы графических компонент в 1С и разберем по шагам, как исправить эту ошибку.
Проблема сжатия штрихкода EAN-13 или других форматов при использовании традиционной ActiveX-компоненты 1C:BarCode обычно вызвана несколькими факторами:
1C:BarCode вычисляет точный размер штрихов кратно пикселям печатающего устройства. Если выделенная область в макете 1С хотя бы на один пиксель меньше требуемого шага, компонента сбрасывает масштаб на уровень ниже. Из-за этого штрихкод сжимается и оставляет по бокам широкие пустые поля.Прежде чем менять программный код, проверим настройки окружения и драйвера принтера:
Разберем, как обойти алгоритм дискретного урезания компоненты 1C:BarCode прямо в редакторе макета 1С:
Чтобы полностью избавиться от зависимости от устаревшей 32-битной компоненты ActiveX и проблем с драйверами, разберем альтернативный вариант — генерацию штрихкода в виде обычного рисунка (PNG/BMP) с помощью стороннего консольного генератора, например Zint Barcode Studio.
Рассмотрим пример кода, с помощью которого можно сформировать штрихкод через внешнюю утилиту и вставить его в печатную форму как объект Картинка:
ВременныйКаталог = КаталогВременныхФайлов();
ПутьКВременномуФайлу = ПолучитьИмяВременногоФайла("png");
// Подготовим данные и сформируем команду запуска
Данные = СтрЗаменить(ДанныеШтрихкода, """", "\""");
// Параметр -b 58 задает тип штрихкода (например, QR или EAN-13 в зависимости от нужд)
СтрокаЗапуска = ВременныйКаталог + "zint.exe -b 58 -o """ + ПутьКВременномуФайлу + """ -d """ + Данные + """";
ЗапуститьПриложение(СтрокаЗапуска, , Истина);
Если НайденФайл(ПутьКВременномуФайлу) Тогда
КартинкаШтрихкода = Новый Картинка(ПутьКВременномуФайлу);
// Вставляем полученное изображение в рисунок табличного документа
РисунокМакета = ОбластьМакета.Рисунки.Штрихкод;
РисунокМакета.Картинка = КартинкаШтрихкода;
УдалитьФайлы(ПутьКВременномуФайлу);
КонецЕсли;
При использовании этого подхода штрихкод формируется как растровое изображение фиксированного высокого разрешения, которое печатается принтером без сжатия и искажения модулей.