Почему при печати ценников в штрихкод добавляется лишняя цифра и как это исправить

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

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

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

Разберем причину: конфликт стандартов UPC-A и EAN-13

Прежде чем приступать к исправлению, давайте проанализируем ситуацию с технической стороны. Штрихкод из 12 цифр — это чаще всего американский стандарт UPC-A. В Европе и России повсеместно используется стандарт EAN-13, который, как следует из названия, содержит 13 цифр.

Важно понимать, что стандарт EAN-13 является расширенной версией UPC-A. Любой 12-значный код UPC-A можно превратить в 13-значный EAN-13, просто добавив в начало цифру 0. Проблема заключается в том, что компонента 1С:Печать штрихкодов (ActiveX V8.Barcod.1 или современные Native-версии) по умолчанию настроена на формат EAN-13. Когда программа передает ей 12 цифр, компонента воспринимает их как "неполный" код EAN-13 и автоматически вычисляет последнюю, 13-ю цифру (контрольное число) по специальному алгоритму. Так в конце кода появляется "случайная" цифра, которая портит штрихкод.

Способ 1. Программная нормализация длины штрихкода

Один из самых простых и надежных способов — привести все штрихкоды к единому 13-значному стандарту перед тем, как отправлять их на печать. Если в базе хранится 12 символов, мы просто добавим к ним лидирующий ноль.

Рассмотрим пример кода, который можно добавить в обработку печати ценников (в процедуру, где формируется область макета):


// Допустим, переменная ТекущийШтрихкод содержит считанный из базы код
ШтрихкодДляПечати = СокрЛП(ТекущийШтрихкод);
Если СтрДлина(ШтрихкодДляПечати) = 12 Тогда
    // Дополняем нулем слева, чтобы превратить UPC-A в корректный EAN-13
    ШтрихкодДляПечати = "0" + ШтрихкодДляПечати;
КонецЕсли;
// Теперь передаем ШтрихкодДляПечати в параметр макета
ОбластьМакета.Параметры.Штрихкод = ШтрихкодДляПечати;

Почему это работает: При добавлении нуля в начало 12-значного кода контрольное число в конце остается прежним. Большинство сканеров штрихкода настроены так, что они либо игнорируют этот первый ноль, либо его можно настроить на автоматическое добавление при сканировании (функция Convert UPC-A to EAN-13 в настройках сканера).

Способ 2. Настройка типа штрихкода в макете

Если вы не хотите менять длину кода, можно попробовать настроить саму компоненту печати непосредственно в макете ценника. Выясним, как это сделать:

  1. Откройте макет ценника в конфигураторе или через режим "Реквизиты и разделы" в пользовательском режиме (если конфигурация позволяет редактировать макеты).
  2. Нажмите правой кнопкой мыши на объекте штрихкода.
  3. Выберите пункт "Элемент управления: 1С:Печать штрихкода" -> "Свойства".
  4. В появившемся окне найдите параметр "Тип кода".
  5. Попробуйте установить значение "Авто" (Auto-type) или явно укажите "UPC-A", если на ваших товарах только 12-значные коды.

Однако стоит учитывать, что не все версии компоненты V8.Barcod корректно отображают это меню. Если при вызове свойств программа закрывается с ошибкой, используйте программный метод управления свойствами.

Способ 3. Глобальное исправление через общий модуль (для УТ 11, Розницы 2.0 и ERP)

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

Вместо жесткой установки типа кода, мы можем реализовать гибкую логику. Посмотрим на пример кода:


// Вставляем логику определения типа вместо стандартной установки ТипКода = 99
Если ПараметрыШтрихкода.ТипКода = 99 Тогда
    ТипШтрихкодаВрем = МенеджерОборудованияКлиентСервер.ОпределитьТипШтрихкода(ШтрихкодВрем);
    
    Если ТипШтрихкодаВрем = "EAN8" Тогда
        ВнешняяКомпонента.ТипКода = 0;
    ИначеЕсли ТипШтрихкодаВрем = "EAN13" Тогда
        ВнешняяКомпонента.ТипКода = 1; 
        // Если код уже содержит контрольный символ (13 знаков), указываем это компоненте
        ВнешняяКомпонента.СодержитКС = (СтрДлина(ШтрихкодВрем) = 13);
    ИначеЕсли ТипШтрихкодаВрем = "CODE39" Тогда
        ВнешняяКомпонента.ТипКода = 3;
    ИначеЕсли ТипШтрихкодаВрем = "CODE128" Тогда
        ВнешняяКомпонента.ТипКода = 4;
    Иначе
        // Если система не уверена, включаем автотип
        ВнешняяКомпонента.АвтоТип = Истина;
    КонецЕсли;
КонецЕсли;

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

Способ 4. Настройка оборудования (Scanner Hardware)

Иногда проблема кроется не в печати, а в том, как сканер передает данные в 1С. Если вы решили использовать метод добавления нуля (Способ 1), вам нужно убедиться, что сканер при считывании "родного" 12-значного штрихкода с упаковки тоже выдает 13 цифр с нулем впереди.

Для этого найдите инструкцию к вашему сканеру и считайте управляющий штрихкод "Convert UPC-A to EAN-13" (или "Enable Leading Zero for UPC-A"). После этого сканер будет добавлять 0 автоматически, и данные в базе 1С будут всегда совпадать с данными на ценнике.

Важные рекомендации при работе с штрихкодами

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

← На главную