Как сформировать штрихкод EAN-13 или Code-128 из строки с префиксами в 1С?

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

В процессе автоматизации складского учета или розничных продаж часто возникает задача генерации штрихкодов для товаров. Типовая ситуация: код справочника Номенклатура содержит не только цифры, но и префиксы (например, «ПР-000123»). Попытка напрямую преобразовать такую строку в формат EAN-13 приводит к ошибкам, так как этот стандарт строго ограничен цифровыми символами. В данной статье мы подробно разберем, как обойти это ограничение, правильно настроить параметры печати и устранить популярную ошибку «Size too small».

Ограничения стандарта EAN-13 и выбор альтернативы

Проанализируем структуру штрихкода EAN-13. Этот стандарт предназначен для кодирования ровно 12 информационных цифр и одной 13-й контрольной цифры. Если исходная строка содержит буквы, у нас есть два пути:

  1. Преобразование строки в число: Мы можем использовать алгоритм замены символов или создать таблицу соответствия (регистр сведений), где каждому строковому коду будет сопоставлен уникальный 12-значный цифровой код. Для внутреннего использования на предприятии рекомендуется использовать префиксы из диапазона от 20 до 29, которые специально зарезервированы для локальных нужд.
  2. Использование стандарта Code-128: Этот тип штрихкода гораздо более гибкий. Он поддерживает полный набор символов ASCII, включая латиницу, кириллицу и спецсимволы. Если ваша задача — закодировать строку «как есть» вместе с префиксом, Code-128 будет лучшим выбором.

Программная настройка параметров штрихкода

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


// Получаем макет для расчета коэффициентов
Эталон = Обработки.ПечатьЭтикетокИЦенников.ПолучитьМакет("Эталон");
КоличествоМиллиметровВПикселе = Эталон.Рисунки.Квадрат100Пикселей.Высота / 100;

// Инициализируем структуру параметров
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина", Окр(ОбластьМакета.Рисунки.КартинкаШтрихкода.Ширина / КоличествоМиллиметровВПикселе));
ПараметрыШтрихкода.Вставить("Высота", Окр(ОбластьМакета.Рисунки.КартинкаШтрихкода.Высота / КоличествоМиллиметровВПикселе));
ПараметрыШтрихкода.Вставить("Штрихкод", СокрЛП(ЧисловойКодПоСсылке(Ссылка)));
ПараметрыШтрихкода.Вставить("ТипВходныхДанных", 0); // 0 означает, что передается строка
ПараметрыШтрихкода.Вставить("ТипКода", 4);         // 4 соответствует формату Code-128
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Ложь);
ПараметрыШтрихкода.Вставить("РазмерШрифта", 6);

В данном примере мы используем ТипКода = 4, что соответствует Code-128. Это позволяет передавать в параметр Штрихкод любую строку, включая префиксы. Если же вам принципиально нужен EAN-13, значение ТипКода следует изменить на 1, а строку предварительно очистить от нецифровых знаков и привести к длине 12 или 13 символов.

Решение проблемы «Size too small»

Разберем ситуацию, когда при попытке формирования картинки система выдает ошибку «Size too small» (размер слишком мал). Выясним причину: каждый графический штрихкод имеет минимально допустимую ширину одного модуля (самой тонкой линии). Если вы пытаетесь вместить длинную строку в узкую рамку в макете 1С, компонента печати не может отрисовать штрихи без потери читаемости и блокирует процесс.

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

  1. Увеличьте ширину рисунка: В макете печатной формы растяните объект КартинкаШтрихкода по горизонтали. Для Code-128 требуется больше места, чем для EAN-13, так как плотность кодирования символов в нем выше.
  2. Программная корректировка: Вы можете принудительно установить ширину в коде, как показано в примере: ПараметрыШтрихкода.Ширина = 100;.
  3. Свойство «Размер картинки»: В свойствах графического объекта в макете 1С установите значение «Пропорционально». Это позволит картинке масштабироваться, сохраняя читаемость, но помните, что физические границы рамки все равно должны быть достаточными.

Расчет контрольного символа для EAN-13

Если вы решили формировать именно EAN-13, вам необходимо самостоятельно рассчитывать 13-й разряд (контрольное число). Проанализируем этот алгоритм, называемый «Модуль 10»:

  1. Сложите цифры, стоящие на четных позициях (2-я, 4-я, 6-я и т.д.).
  2. Умножьте полученную сумму на 3.
  3. Сложите цифры, стоящие на нечетных позициях (1-я, 3-я, 5-я и т.д.), кроме последней (если их 13).
  4. Сложите результаты шагов 2 и 3.
  5. Контрольное число — это разница между полученной суммой и ближайшим к ней бóльшим числом, кратным 10.

В современных конфигурациях на базе Библиотеки стандартных подсистем (БСП) этот расчет выполняется автоматически при вызове функций общего модуля МенеджерПечати или ГенерацияШтрихкода.

Современный подход через БСП

Посмотрим на более актуальный метод формирования изображения штрихкода, который избавляет от ручных расчетов пикселей. Рассмотрим использование функции МенеджерПечати.СформироватьКартинкуШтрихкода(). Этот метод возвращает двоичные данные картинки, которые можно напрямую поместить в макет.

Преимущества работы через БСП:

Проанализируем ситуацию с печатью на термопринтерах этикеток. Важно помнить, что разрешение таких принтеров обычно составляет 203 или 300 dpi. Чтобы избежать размытия штрихов, ширина тонкого элемента должна быть кратна физической точке печати. Если сканер плохо читает код, попробуйте немного увеличить или уменьшить ширину поля в макете, чтобы «попасть» в сетку печатающей головки принтера.

Подводя итог, отметим: если ваша строка содержит префиксы — используйте Code-128. Если требуется строго EAN-13 — обеспечьте наличие только 12 цифр и программно рассчитывайте 13-й разряд. Всегда следите за тем, чтобы ширина области вывода была достаточной для выбранного объема данных, чтобы избежать ошибок компоненты печати.

← На главную