При работе с торговым оборудованием программисты 1С часто сталкиваются с проблемой: штрихкод, выводимый через стандартную компоненту AddIn.КартинкаШтрихкода, получается размытым или «ступенчатым». Это происходит из-за несоответствия стандартного экранного разрешения (72 или 96 DPI) реальному разрешению термоголовки принтера этикеток (обычно 203 DPI, реже 300 или 600 DPI). Сканеры, особенно старые лазерные модели, плохо считывают такие коды из-за эффекта антиалиазинга (сглаживания), который превращает четкую черную линию в набор серых пикселей.
В этой статье мы подробно разберем, как добиться идеальной четкости печати штрихкода «точка в точку» и какие альтернативные методы генерации изображений существуют.
Основная причина проблем заключается в том, что компонента 1С:Печать штрихкодов генерирует растровое изображение. Если мы просто растягиваем картинку в макете, платформа масштабирует её, внося искажения. Чтобы избежать этого, нам необходимо рассчитать точное количество пикселей, которое соответствует физическому размеру этикетки при разрешении 203 DPI.
Проанализируем формулу расчета. Поскольку 1 дюйм равен 25.4 миллиметра, расчет для ширины и высоты в пикселях будет выглядеть следующим образом:
Пиксели = (Размер в мм / 25.4) * DPI принтера
Рассмотрим пример кода, который подготавливает параметры для компоненты, исходя из физического размера области печати 40х25 мм:
// Определяем параметры принтера и требуемый размер в мм
РазрешениеПринтера = 203;
ШиринаММ = 40;
ВысотаММ = 25;
// Рассчитываем размер в пикселях
НужнаяШиринаПикс = Окр((ШиринаММ / 25.4) * РазрешениеПринтера);
НужнаяВысотаПикс = Окр((ВысотаММ / 25.4) * РазрешениеПринтера);
// Устанавливаем параметры в компоненту
ОбъектКомпоненты.Ширина = НужнаяШиринаПикс;
ОбъектКомпоненты.Высота = НужнаяВысотаПикс;
При таком подходе компонента сформирует изображение, где каждая линия штрихкода будет соответствовать определенному количеству физических точек термоголовки принтера, что исключит размытие.
Начиная с версии платформы 8.3.10 и при использовании актуальных версий компоненты AddIn.КартинкаШтрихкода (версии 10 и выше), появилась поддержка формата SVG. Это качественный скачок в решении проблемы. В отличие от растровых форматов (BMP, PNG), векторный формат SVG описывает штрихкод математическими примитивами (линиями и прямоугольниками).
Выясним преимущества этого метода: при печати через драйвер принтера векторное изображение масштабируется без потери качества. Драйвер сам переводит векторные команды в точки принтера максимально эффективно. Чтобы использовать этот метод, проверьте свойства вашей компоненты и убедитесь, что в методах получения картинки указан тип формата SVG.
Если стандартная компонента 1С не позволяет добиться нужного результата (например, при использовании специфических типов кодов, таких как EAN-13+5), можно воспользоваться мощным открытым движком Zint. Рассмотрим, как реализовать генерацию через командную строку.
Проанализируем ситуацию: нам нужно запустить внешнее приложение zint.exe, передать ему данные штрихкода и параметры сохранения файла, а затем прочитать полученную картинку в 1С. Пример реализации может выглядеть так:
// Путь к консольной утилите и временному файлу
ПутьКZint = "C:\Zint\zint.exe";
ПутьКФайлу = КаталогВременныхФайлов() + "barcode.png";
ДанныеШК = "4601234567890";
// Формируем строку параметров (DPI, тип кода, данные)
// Параметр --scale позволяет управлять плотностью
ПараметрыЗапуска = "-o " + ПутьКФайлу + " -d " + ДанныеШК + " -b 34 --scale=2";
// Запускаем генерацию
ЗапуститьПриложение(ПутьКZint + " " + ПараметрыЗапуска, , Истина);
// Загружаем результат в 1С
КартинкаШтрихкода = Новый Картинка(ПутьКФайлу);
Этот метод гарантирует высокую гибкость, так как Zint поддерживает сотни стандартов штрихкодирования и позволяет точно настраивать размеры модулей (узких линий).
Самым профессиональным способом считается отказ от формирования графической картинки в пользу отправки текстовых команд напрямую в принтер. Если ваш принтер поддерживает язык ZPL (Zebra Programming Language), вы можете отправить команду создания штрихкода, и процессор принтера сам отрисует его с максимально возможной резкостью.
Разберем пример управляющей строки ZPL для штрихкода Code 128:
^XA
^FO50,50^BY3
^BCN,100,Y,N,N
^FD12345678^FS
^XZ
В данном коде:
^BY3 — устанавливает ширину узкого модуля в 3 точки принтера;^BC — команда отрисовки Code 128;^FD — данные штрихкода.
Для реализации этого метода в 1С можно использовать объект ТекстовыйДокумент, который сохраняется в файл и копируется в порт принтера, либо использовать библиотеку winspool.drv через ExternalConnection.
Если вы не хотите использовать внешние компоненты, можно установить в систему шрифты типа TrueType (например, для EAN-13 или Code 128). Выясним, как это работает: вы просто меняете шрифт в ячейке табличного документа 1С на шрифт штрихкода и выводите туда подготовленную строку данных (с учетом контрольных символов). Поскольку шрифты являются векторными объектами, они печатаются с максимальным разрешением драйвера принтера без «грязных» пикселей.
Часто проблема кроется не в 1С, а в настройках драйвера Windows. Проанализируем критически важные настройки:
Это заставит драйвер печатать только черным и белым цветом, не пытаясь имитировать градации серого, что мгновенно повышает контрастность и читаемость кода сканерами.
Важный итог: для достижения наилучшего результата на принтерах 203 DPI рекомендуется либо точно рассчитывать пиксельный размер картинки (Метод 1), либо использовать векторный формат SVG, если это позволяет версия вашей платформы.