Как снять ограничение в 16 символов для штрихкода серии в 1С:ERP

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

В процессе работы с маркировкой товаров и учетом серий в 1С:ERP Управление предприятием многие технические специалисты сталкиваются с досадным ограничением: при печати этикеток номер серии, используемый в качестве штрихкода, обрезается до 16 знаков. Это происходит даже в тех случаях, когда выбран тип штрихкода Code128 или QR-код, которые по стандартам поддерживают гораздо большую длину данных. Рассмотрим подробнее, почему так происходит и как мы можем решить эту задачу с помощью механизмов расширения платформы 1С:Предприятие 8.3.

Выясним причину проблемы

Проанализируем ситуацию с точки зрения программного кода. Ограничение не связано с хранением данных в справочнике СерииНоменклатуры, где длина наименования или номера серии обычно достаточна для большинства задач. Проблема кроется в подсистеме печати этикеток и ценников, которая используется во многих типовых конфигурациях (ERP, КА, УТ).

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


СерииНоменклатуры = Новый ТаблицаЗначений;
СерииНоменклатуры.Колонки.Добавить("Серия", Новый ОписаниеТипов("СправочникСсылка.СерииНоменклатуры"));
СерииНоменклатуры.Колонки.Добавить("Штрихкод", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(16)));

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

Зачем 1С ввела это ограничение?

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

  1. Плотность кода: Чем больше символов в линейном штрихкоде, тем шире он становится. На стандартной этикетке размером 58х40 мм или 30х20 мм штрихкод из 20-30 символов станет настолько "плотным", что линии сольются, и бюджетные сканеры не смогут его прочитать.
  2. Стандарты GS1: Хотя международные стандарты (например, GS1-128) допускают серийные номера до 20 символов, 1С ориентируется на наиболее распространенные сценарии, где 16 знаков являются разумным пределом для сохранения читаемости на малых форматах.

Однако, если мы используем современные 2D-коды (DataMatrix или QR) или печатаем на крупных этикетках, это ограничение становится неоправданным препятствием.

Пошаговое решение через расширение

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

Шаг 1. Создание расширения. Создадим новое расширение и добавим в него объект, отвечающий за печать (обычно это обработка ПечатьЭтикетокИЦенников или модуль менеджера справочника СерииНоменклатуры).

Шаг 2. Перехват функции. Найдем функцию ПодготовитьДанныеДляПечати (или аналогичную, в зависимости от версии вашей ERP). Нам необходимо использовать аннотацию &Вместо, чтобы полностью переопределить логику создания таблицы данных, либо &ИзменениеИКонтроля, если платформа позволяет точечно заменить строку.

Проанализируем пример кода для расширения с использованием &Вместо:


&Вместо("ПодготовитьДанныеДляПечати")
Функция Изм_ПодготовитьДанныеДляПечати(ПечатьКаждойШт, Знач ВыделенныеСтроки)
    
    // Копируем стандартную логику создания таблицы, но меняем длину строки
    СерииНоменклатуры = Новый ТаблицаЗначений;
    СерииНоменклатуры.Колонки.Добавить("Серия", Новый ОписаниеТипов("СправочникСсылка.СерииНоменклатуры"));
    
    // Устанавливаем длину, например, 100 символов или убираем ограничение вовсе
    СерииНоменклатуры.Колонки.Добавить("Штрихкод", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(100)));
    
    // ... Далее следует остальная логика заполнения таблицы из оригинальной функции ...
    
    Возврат СерииНоменклатуры;
КонецФункции

Шаг 3. Проверка общих модулей. Важно понимать, что ограничение может дублироваться. Рекомендуется проверить общий модуль ШтрихкодированиеСервер. Если система использует его для формирования временных структур, там также может встретиться аналогичный КвалификаторСтроки. Проанализируем все места в коде, где фигурирует создание колонок с именем "Штрихкод" в контексте печати серий.

Подводные камни и рекомендации

Снятие программного ограничения — это только половина дела. Разберем, с какими сложностями мы можем столкнуться после внесения изменений:

  1. Ошибки компоненты печати штрихкодов: Компонента 1С:Печать штрихкодов имеет встроенные механизмы проверки. Если вы попытаетесь вывести 40 символов в формате EAN13, система выдаст ошибку, так как этот формат жестко ограничен 13 цифрами. Всегда проверяйте, что в шаблоне этикетки выбран подходящий тип (Code128 или QR).
  2. Размер области в макете: В редакторе шаблонов этикеток область штрихкода имеет фиксированные границы. Если строка данных станет слишком длинной, штрихкод может просто не отобразиться ("пустое место") или вывести надпись "Слишком маленькая область". Решением будет увеличение области в редакторе шаблонов или уменьшение размера шрифта/плотности в свойствах объекта штрихкода.
  3. Читаемость сканером: После внедрения доработки обязательно проведем тест. Распечатаем этикетку с максимально длинной серией и попробуем считать ее обычным ручным сканером. Если чтение нестабильное, рассмотрим переход на DataMatrix. Этот формат кодирует большие объемы данных на очень маленькой площади и гораздо устойчивее к повреждениям и плотности печати.

Использование 2D-кодов как альтернатива

Если специфика вашего бизнеса позволяет отойти от линейных кодов, использование QR-кода или DataMatrix снимет большинство проблем с длиной серии. Даже если в коде 1С остается ограничение в 16-30-50 символов, 2D-код визуально не будет увеличиваться в геометрической прогрессии, как Code128. Однако помните, что даже для QR-кода в типовой обработке печати ERP все равно придется выполнить расширение, описанное выше, так как обрезка строки до 16 знаков происходит до того, как данные передаются в генератор графического изображения.

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

← На главную