В процессе автоматизации складского учета или розничных продаж часто возникает задача генерации штрихкодов для товаров. Типовая ситуация: код справочника Номенклатура содержит не только цифры, но и префиксы (например, «ПР-000123»). Попытка напрямую преобразовать такую строку в формат EAN-13 приводит к ошибкам, так как этот стандарт строго ограничен цифровыми символами. В данной статье мы подробно разберем, как обойти это ограничение, правильно настроить параметры печати и устранить популярную ошибку «Size too small».
Проанализируем структуру штрихкода EAN-13. Этот стандарт предназначен для кодирования ровно 12 информационных цифр и одной 13-й контрольной цифры. Если исходная строка содержит буквы, у нас есть два пути:
Рассмотрим пример кода, который используется для подготовки параметров печати штрихкода. Важно правильно рассчитать физические размеры картинки, чтобы сканер мог уверенно считать штрихи. Мы будем использовать макет «Эталон» для пересчета миллиметров в пиксели, что обеспечит корректное отображение на разных принтерах.
// Получаем макет для расчета коэффициентов
Эталон = Обработки.ПечатьЭтикетокИЦенников.ПолучитьМакет("Эталон");
КоличествоМиллиметровВПикселе = Эталон.Рисунки.Квадрат100Пикселей.Высота / 100;
// Инициализируем структуру параметров
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина", Окр(ОбластьМакета.Рисунки.КартинкаШтрихкода.Ширина / КоличествоМиллиметровВПикселе));
ПараметрыШтрихкода.Вставить("Высота", Окр(ОбластьМакета.Рисунки.КартинкаШтрихкода.Высота / КоличествоМиллиметровВПикселе));
ПараметрыШтрихкода.Вставить("Штрихкод", СокрЛП(ЧисловойКодПоСсылке(Ссылка)));
ПараметрыШтрихкода.Вставить("ТипВходныхДанных", 0); // 0 означает, что передается строка
ПараметрыШтрихкода.Вставить("ТипКода", 4); // 4 соответствует формату Code-128
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Ложь);
ПараметрыШтрихкода.Вставить("РазмерШрифта", 6);
В данном примере мы используем ТипКода = 4, что соответствует Code-128. Это позволяет передавать в параметр Штрихкод любую строку, включая префиксы. Если же вам принципиально нужен EAN-13, значение ТипКода следует изменить на 1, а строку предварительно очистить от нецифровых знаков и привести к длине 12 или 13 символов.
Разберем ситуацию, когда при попытке формирования картинки система выдает ошибку «Size too small» (размер слишком мал). Выясним причину: каждый графический штрихкод имеет минимально допустимую ширину одного модуля (самой тонкой линии). Если вы пытаетесь вместить длинную строку в узкую рамку в макете 1С, компонента печати не может отрисовать штрихи без потери читаемости и блокирует процесс.
Для исправления ситуации выполните следующие шаги:
КартинкаШтрихкода по горизонтали. Для Code-128 требуется больше места, чем для EAN-13, так как плотность кодирования символов в нем выше.ПараметрыШтрихкода.Ширина = 100;.Если вы решили формировать именно EAN-13, вам необходимо самостоятельно рассчитывать 13-й разряд (контрольное число). Проанализируем этот алгоритм, называемый «Модуль 10»:
В современных конфигурациях на базе Библиотеки стандартных подсистем (БСП) этот расчет выполняется автоматически при вызове функций общего модуля МенеджерПечати или ГенерацияШтрихкода.
Посмотрим на более актуальный метод формирования изображения штрихкода, который избавляет от ручных расчетов пикселей. Рассмотрим использование функции МенеджерПечати.СформироватьКартинкуШтрихкода(). Этот метод возвращает двоичные данные картинки, которые можно напрямую поместить в макет.
Преимущества работы через БСП:
Проанализируем ситуацию с печатью на термопринтерах этикеток. Важно помнить, что разрешение таких принтеров обычно составляет 203 или 300 dpi. Чтобы избежать размытия штрихов, ширина тонкого элемента должна быть кратна физической точке печати. Если сканер плохо читает код, попробуйте немного увеличить или уменьшить ширину поля в макете, чтобы «попасть» в сетку печатающей головки принтера.
Подводя итог, отметим: если ваша строка содержит префиксы — используйте Code-128. Если требуется строго EAN-13 — обеспечьте наличие только 12 цифр и программно рассчитывайте 13-й разряд. Всегда следите за тем, чтобы ширина области вывода была достаточной для выбранного объема данных, чтобы избежать ошибок компоненты печати.