При работе с торговым оборудованием в 1С пользователи часто сталкиваются с ситуацией, когда штрихкод товара, состоящий из 12 цифр, при печати на ценнике или этикетке внезапно превращается в 13-значный. Это приводит к тому, что напечатанный штрихкод перестает соответствовать тому, что записано в базе данных, и сканер при продаже выдает ошибку "Товар не найден".
В этой статье мы подробно разберем причины возникновения этой проблемы, выясним разницу между мировыми стандартами кодирования и рассмотрим несколько эффективных способов решения задачи: от простых настроек в макете до внесения изменений в программный код 1С.
Прежде чем приступать к исправлению, давайте проанализируем ситуацию с технической стороны. Штрихкод из 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-ю цифру (контрольное число) по специальному алгоритму. Так в конце кода появляется "случайная" цифра, которая портит штрихкод.
Один из самых простых и надежных способов — привести все штрихкоды к единому 13-значному стандарту перед тем, как отправлять их на печать. Если в базе хранится 12 символов, мы просто добавим к ним лидирующий ноль.
Рассмотрим пример кода, который можно добавить в обработку печати ценников (в процедуру, где формируется область макета):
// Допустим, переменная ТекущийШтрихкод содержит считанный из базы код
ШтрихкодДляПечати = СокрЛП(ТекущийШтрихкод);
Если СтрДлина(ШтрихкодДляПечати) = 12 Тогда
// Дополняем нулем слева, чтобы превратить UPC-A в корректный EAN-13
ШтрихкодДляПечати = "0" + ШтрихкодДляПечати;
КонецЕсли;
// Теперь передаем ШтрихкодДляПечати в параметр макета
ОбластьМакета.Параметры.Штрихкод = ШтрихкодДляПечати;
Почему это работает: При добавлении нуля в начало 12-значного кода контрольное число в конце остается прежним. Большинство сканеров штрихкода настроены так, что они либо игнорируют этот первый ноль, либо его можно настроить на автоматическое добавление при сканировании (функция Convert UPC-A to EAN-13 в настройках сканера).
Если вы не хотите менять длину кода, можно попробовать настроить саму компоненту печати непосредственно в макете ценника. Выясним, как это сделать:
Однако стоит учитывать, что не все версии компоненты V8.Barcod корректно отображают это меню. Если при вызове свойств программа закрывается с ошибкой, используйте программный метод управления свойствами.
В современных конфигурациях печать штрихкода часто вынесена в общие модули управления оборудованием. Проанализируем решение, при котором система будет автоматически определять тип штрихкода и правильно настраивать внешнюю компоненту. Нам потребуется найти функцию ПодготовитьИзображениеШтрихкода в модуле ГенерацияШтрихкода.
Вместо жесткой установки типа кода, мы можем реализовать гибкую логику. Посмотрим на пример кода:
// Вставляем логику определения типа вместо стандартной установки ТипКода = 99
Если ПараметрыШтрихкода.ТипКода = 99 Тогда
ТипШтрихкодаВрем = МенеджерОборудованияКлиентСервер.ОпределитьТипШтрихкода(ШтрихкодВрем);
Если ТипШтрихкодаВрем = "EAN8" Тогда
ВнешняяКомпонента.ТипКода = 0;
ИначеЕсли ТипШтрихкодаВрем = "EAN13" Тогда
ВнешняяКомпонента.ТипКода = 1;
// Если код уже содержит контрольный символ (13 знаков), указываем это компоненте
ВнешняяКомпонента.СодержитКС = (СтрДлина(ШтрихкодВрем) = 13);
ИначеЕсли ТипШтрихкодаВрем = "CODE39" Тогда
ВнешняяКомпонента.ТипКода = 3;
ИначеЕсли ТипШтрихкодаВрем = "CODE128" Тогда
ВнешняяКомпонента.ТипКода = 4;
Иначе
// Если система не уверена, включаем автотип
ВнешняяКомпонента.АвтоТип = Истина;
КонецЕсли;
КонецЕсли;
Этот подход позволяет избежать ситуации, когда компонента "додумывает" цифры за нас. Мы явно говорим ей: "Если в коде 13 цифр, считай, что контрольный символ уже есть, и не пересчитывай его".
Иногда проблема кроется не в печати, а в том, как сканер передает данные в 1С. Если вы решили использовать метод добавления нуля (Способ 1), вам нужно убедиться, что сканер при считывании "родного" 12-значного штрихкода с упаковки тоже выдает 13 цифр с нулем впереди.
Для этого найдите инструкцию к вашему сканеру и считайте управляющий штрихкод "Convert UPC-A to EAN-13" (или "Enable Leading Zero for UPC-A"). После этого сканер будет добавлять 0 автоматически, и данные в базе 1С будут всегда совпадать с данными на ценнике.
Native API компоненту печати. Она работает стабильнее старой ActiveX версии. Если у вас возникают ошибки "не удалось сформировать штрихкод", убедитесь, что установлена последняя версия 1CBarCode.exe.Code39). Они не добавляют контрольных цифр сами по себе, но требуют предварительной подготовки строки программно.Подводя итог, можно сказать, что появление лишней цифры — это не ошибка программы, а следствие строгого соблюдения стандарта EAN-13 компонентой печати. Используя программную подстановку лидирующего нуля или явное указание типа кода в параметрах компоненты, вы сможете добиться корректного отображения штрихкодов на ваших ценниках.