Почему штрихкод печатается слишком сжатым и не читается сканером в 1С

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

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

Выясним причины искажения штрихкода

Проблема сжатия штрихкода EAN-13 или других форматов при использовании традиционной ActiveX-компоненты 1C:BarCode обычно вызвана несколькими факторами:

  1. Разница в разрешении (DPI) экрана и принтера. Внешняя компонента рендерит векторное изображение штрихкода под экранное разрешение (обычно 96 DPI). Принтеры этикеток работают с плотностью печати 203 DPI, 300 DPI или 600 DPI. При передаче графического объекта в драйвер происходит пересчет точек, в результате чего ширина штрихов меняется некорректно.
  2. Дискретный шаг масштабирования ActiveX. Чтобы штрихкод сохранял правильные пропорции (соотношение узких и широких полос), компонента 1C:BarCode вычисляет точный размер штрихов кратно пикселям печатающего устройства. Если выделенная область в макете 1С хотя бы на один пиксель меньше требуемого шага, компонента сбрасывает масштаб на уровень ниже. Из-за этого штрихкод сжимается и оставляет по бокам широкие пустые поля.
  3. Включенное полутоновое сглаживание (Dithering) в драйвере. Термопринтеры печатают исключительно монохромные элементы (черные и белые). Если в свойствах принтера включен режим размытия или полутонов, границы линий превращаются в пиксельную «гребенку», из-за чего сканер не может считать код.
  4. Автомасштабирование в 1С. Использование функций «Автомасштаб» или «По ширине страницы» в параметрах печатной формы заставляет платформу пропорционально сжимать все элементы табличного документа.

Решение 1. Настройка параметров печати и драйвера принтера

Прежде чем менять программный код, проверим настройки окружения и драйвера принтера:

  1. Отключим автомасштаб в табличном документе. В параметрах печати печатной формы убедимся, что снята галочка «Автомасштаб» и задан масштаб 100%. Размеры страницы в миллиметрах должны строго соответствовать физическому размеру этикетки.
  2. Изменим режим графики в настройках драйвера Windows. Перейдем в свойства принтера этикеток на вкладку настройки печати (Graphics / Настройка печати). Изменим параметр обработки полутонов (Dithering) на значение «Нет» (None / Line Art / Binary). Это заставит принтер печатать четкие черные полосы без размытия по краям.
  3. Установим системный масштаб Windows в 100%. Убедимся, что в свойствах экрана операционной системы установлен стандартный масштаб 100% (96 DPI). Повышенные значения (125%, 150%) приводят к сбоям расчетных размеров ActiveX-объектов.

Решение 2. Подгонка границ ячейки в макете 1С

Разберем, как обойти алгоритм дискретного урезания компоненты 1C:BarCode прямо в редакторе макета 1С:

  1. Откроем макет печатной формы в режиме конфигуратора или редактора.
  2. Пошагово увеличим ширину области со штрихкодом на 1–2 мм вправо.
  3. Сформируем печатную форму и отправим её на печать.
  4. Как только ширина рамки достигнет следующего порога дискретизации, компонента переключится на крупный модуль, и штрихкод автоматически расправится на всю доступную ширину.

Решение 3. Использование внешней утилиты генерации картинок (Zint)

Чтобы полностью избавиться от зависимости от устаревшей 32-битной компоненты ActiveX и проблем с драйверами, разберем альтернативный вариант — генерацию штрихкода в виде обычного рисунка (PNG/BMP) с помощью стороннего консольного генератора, например Zint Barcode Studio.

Рассмотрим пример кода, с помощью которого можно сформировать штрихкод через внешнюю утилиту и вставить его в печатную форму как объект Картинка:


ВременныйКаталог = КаталогВременныхФайлов();
ПутьКВременномуФайлу = ПолучитьИмяВременногоФайла("png");

// Подготовим данные и сформируем команду запуска
Данные = СтрЗаменить(ДанныеШтрихкода, """", "\""");
// Параметр -b 58 задает тип штрихкода (например, QR или EAN-13 в зависимости от нужд)
СтрокаЗапуска = ВременныйКаталог + "zint.exe -b 58 -o """ + ПутьКВременномуФайлу + """ -d """ + Данные + """";

ЗапуститьПриложение(СтрокаЗапуска, , Истина);

Если НайденФайл(ПутьКВременномуФайлу) Тогда
    КартинкаШтрихкода = Новый Картинка(ПутьКВременномуФайлу);
    
    // Вставляем полученное изображение в рисунок табличного документа
    РисунокМакета = ОбластьМакета.Рисунки.Штрихкод;
    РисунокМакета.Картинка = КартинкаШтрихкода;
    
    УдалитьФайлы(ПутьКВременномуФайлу);
КонецЕсли;

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

← На главную