Почему не читаются вновь распечатанные акцизные марки и как решить эту проблему?

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

При работе с подакцизным алкоголем в конфигурации 1С:Розница (включая релизы ветки 2.2 и выше) пользователи часто сталкиваются с критической проблемой: новые акцизные марки, запрошенные из ЕГАИС и распечатанные на обычном офисном принтере, наотрез отказываются считываться 2D-сканерами на кассе. При этом визуально марка выглядит абсолютно четкой, без смазанных линий и дефектов. Попытки напечатать марку на другом принтере (струйном или лазерном) чаще всего не приносят результата, а временным решением становится нецелесообразное увеличение масштаба штрихкода до размеров половины листа А4.

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

Выясняем причины: почему обычный принтер «портит» PDF417?

Для начала проанализируем физику процесса считывания штрихкода сканером. Двухмерный код PDF417, который используется на акцизных марках ЕГАИС, состоит из чередования черных и белых прямоугольных элементов (микромодулей) строго определенной ширины. Сканер считывает разницу контрастов между этими элементами.

Когда мы отправляем штрихкод на печать из 1С на обычный офисный лазерный или струйный принтер формата А4, в дело вступают следующие негативные факторы:

  1. Эффект сглаживания (Anti-aliasing) драйвера принтера. В отличие от специализированных принтеров этикеток, печатающих «точка в точку» под физическое разрешение термоголовки (например, 203 или 300 dpi), стандартные офисные принтеры оптимизированы для печати текста и фотографий. Драйвер принтера пытается сделать картинку субъективно более красивой и сглаживает резкие границы черных линий полутонами (серыми точками). Человеческому глазу штрихкод кажется идеальным, но сенсор сканера видит «грязные», размытые серые границы модулей и не может декодировать строку.
  2. Искажение пропорций в макете 1С. Компонента печати штрихкодов в 1С генерирует изображение динамически. Если в свойствах рисунка на макете установлено свойство Растягивать, то при изменении размеров ячеек таблицы штрихкод деформируется. Нарушение математических пропорций PDF417 даже на доли миллиметра делает марку нечитаемой.
  3. Проблемы масштабирования и разрядности платформы. При генерации штрихкода высокой плотности (акцизная марка содержит длинную последовательность из 68 или 150 символов) встроенная компонента 1CBarCode может некорректно рассчитывать шаг линий на 64-битных версиях платформы 1С:Предприятие.

Решение 1. Корректировка параметров макета и свойств рисунка в 1С

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

Разберем этот процесс по шагам:

  1. Откроем конфигуратор и найдем макет, отвечающий за печать акцизной марки (обычно это макет в составе обработки печатной формы или самой конфигурации «1С:Розница»).
  2. Найдем область макета, в которой расположен графический объект штрихкода. Нажмем на него правой кнопкой мыши и выберем пункт «Свойства».
  3. В палитре свойств найдем параметр «Размер картинки» (или «Тип заполнения»). По умолчанию там часто установлено значение Растягивать. Нам необходимо принудительно установить значение Реальный размер или Пропорционально. Это заставит платформу выводить штрихкод пиксель-в-пиксель без интерполяции под границы сетки ячеек.
  4. Обратим внимание на свободные поля вокруг штрихкода. Для успешного позиционирования луча 2D-сканера необходима так называемая «тихая зона» (белое поле по краям кода). Настроим свойства компоненты штрихкода, установив параметр QuietZone (или «Свободная зона») в значение истины, либо просто увеличим белые отступы в макете вокруг картинки.

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


ОбластьМакета = Макет.ПолучитьОбласть("ОбластьШтрихкода");
РисунокШтрихкод = ОбластьМакета.Рисунки.ШтрихкодМарки;
// Устанавливаем тип кода PDF417
РисунокШтрихкод.Объект.ТипКода = 11; 
// Отключаем отображение текстовой расшифровки под кодом
РисунокШтрихкод.Объект.ОтображатьТекст = Ложь;
// Задаем максимальный уровень коррекции ошибок для надежности
РисунокШтрихкод.Объект.УровеньКоррекцииОшибок = 4;

Решение 2. Тонкая настройка драйвера лазерного принтера

Если макет настроен правильно, но принтер все равно размывает границы, нам необходимо отключить «интеллектуальные» функции улучшения графики в операционной системе Windows. Мы должны заставить лазерный принтер печатать штрихкод максимально жестко, контрастно и без полутонов.

Выполним следующую последовательность действий:

  1. Перейдем в панель управления компьютера, откроем раздел «Устройства и принтеры».
  2. Кликнем правой кнопкой мыши на целевой лазерный принтер и выберем пункт «Настройка печати» (или «Свойства принтера» -> вкладка «Настройка»).
  3. Найдем вкладку, отвечающую за качество графики (в зависимости от производителя она может называться «Графика», «Качество», «Paper/Quality» или «Advanced»).
  4. Отключим любые режимы экономии тонера (параметры вроде Toner Save или Экономия картриджа должны быть полностью деактивированы). При нехватке тонера принтер делает заливку бледной, что критично для сканера.
  5. Найдем параметр Dithering (Размытие / Полутона). Изменим его значение с «Halftone» (Полутона) на «None» (Нет) или «Line Art» (Штриховой рисунок / Черно-белое). Это ключевая настройка! Она запрещает принтеру сглаживать черные элементы серыми точками.
  6. Если в драйвере доступна регулировка плотности (Density / Darkness), установим ползунок на максимальное значение черного цвета.
  7. Сохраним настройки и выполним пробную печать акцизной марки.

Решение 3. Использование альтернативного формата кодирования (DataMatrix)

Как показывает практика автоматизации розничной торговли, формат PDF417 физически сложнее для распознавания обычными сканерами, особенно на матовой офисной бумаге. Если правила ЕГАИС и текущие механизмы УТМ позволяют передавать марку в виде строки, кассовой программе абсолютно неважно, в каком графическом виде сканер передаст расшифрованный штрихкод в систему.

Формат DataMatrix гораздо более устойчив к качеству печати, замятиям бумаги и низкому разрешению принтера по сравнению с PDF417. Мы можем переопределить генерацию печатной формы в 1С, чтобы она кодировала ту же самую строку акцизной марки в формат DataMatrix. На обычных офисных принтерах читаемость таких кодов приближается к 100%.

Для реализации этого метода потребуется изменить тип кода в свойствах компоненты печати штрихкодов на значение, соответствующее DataMatrix (в компоненте 1CBarCode это обычно тип кода 16), либо воспользоваться встроенными возможностями платформы 1С 8.3 для генерации двухмерных кодов без использования внешних библиотек.


Решение 4. Использование внешних API для генерации идеальной картинки

Если штатная компонента печати штрихкодов 1С продолжает генерировать нечитаемый код на уровне платформы, мы можем обойти эту проблему с помощью внешних веб-сервисов генерации штрихкодов. Этот метод гарантирует получение математически точного векторного или растрового изображения штрихкода высокого разрешения, которое не будет искажаться драйвером принтера.

Проанализируем алгоритм работы этого решения:

  1. При формировании печатной формы код 1С отправляет HTTP-запрос к проверенному онлайн-генератору штрихкодов, передавая в параметрах запроса строку акцизной марки, тип кодирования (PDF417 или DataMatrix) и желаемое разрешение (например, 300 или 600 DPI).
  2. Сервис возвращает чистый бинарный файл картинки (в формате PNG или BMP).
  3. Полученная картинка программно помещается в область макета вместо стандартного объекта штрихкода 1С.

Рассмотрим пример кода, реализующий получение качественного изображения марки через HTTP-соединение:


Функция ПолучитьКартинкуМаркиССервиса(СтрокаМарки) Экспорт
    // Кодируем строку марки для передачи в URL
    КодированнаяСтрока = КодироватьСтроку(СтрокаМарки, СпособКодированияСтроки.URLКодирование);
    
    СерверГенерации = "barcode.tec-it.com";
    АдресЗапроса = "/barcode.ashx?data=" + КодированнаяСтрока + "&code=PDF417&dpi=300&resolution=High";
    
    Попытка
        HTTPСоединение = Новый HTTPСоединение(СерверГенерации, 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
        HTTPЗапрос = Новый HTTPЗапрос(АдресЗапроса);
        HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
        
        Если HTTPОтвет.КодСостояния = 200 Тогда
            Возврат HTTPОтвет.ПолучитьТелоКакКартинку();
        Иначе
            ЗаписатьЛогОшибки("Ошибка сервиса генерации штрихкодов. Код: " + HTTPОтвет.КодСостояния);
            Возврат Неопределено;
        КонецЕсли;
    Исключение
        ЗаписатьЛогОшибки("Не удалось подключиться к серверу генерации штрихкодов.");
        Возврат Неопределено;
    КонецПопытки;
КонецФункции

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


Решение 5. Настройка и калибровка самого 2D-сканера

Иногда корень проблемы кроется не в качестве печати, а в настройках считывающего оборудования. Большинство 2D-сканеров «из коробки» настроены на распознавание глянцевых поверхностей (стекло бутылок, жестяные банки) и имеют встроенные алгоритмы подавления бликов. При попытке считать плотный код PDF417 с обычной матовой бумаги эти алгоритмы могут мешать корректному распознаванию.

Для исправления ситуации выполним следующие шаги по калибровке сканера:

  1. Найдем официальное руководство по программированию (Programming Manual) для вашей модели сканера (например, Honeywell Voyage, Zebra DS2208, Datalogic QuickScan).
  2. Найдем раздел, посвященный двухмерным штрихкодам PDF417 Symbology.
  3. Считаем настроечный штрихкод, который принудительно включает или оптимизирует распознавание PDF417 (в некоторых моделях по умолчанию включены только базовые типы кодов для экономии памяти устройства).
  4. Если сканер поддерживает настройку контрастности, найдем и считаем управляющий код «Read Low Contrast Barcodes» (Чтение низкоконтрастных штрихкодов) или «Matte Paper Mode» (Режим работы с матовой бумагой).
  5. Проверим режим работы сканера — эмуляция клавиатуры (Keyboard Wedge) в редких случаях может «терять» символы при передаче длинной строки акцизной марки в 1С. Рекомендуется перевести сканер в режим USB-COM (эмуляция COM-порта), установив соответствующий драйвер в операционной системе и настроив подключение оборудования в интерфейсе «1С:Розница» через родной драйвер «1С:Сканеры штрихкода».

Системный подход, сочетающий в себе проверку геометрических пропорций макета печатной формы в 1С, отключение размытия в драйвере принтера и правильную калибровку сканирующего оборудования, гарантирует стопроцентное считывание вновь распечатанных акцизных марок без необходимости покупки дорогостоящих термотрансферных принтеров этикеток.

← На главную