Почему штрихкоды EAN-13 по-разному выводятся на печать в 1С:Управление торговлей и как это исправить

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

При работе с торговыми конфигурациями, такими как 1С:Управление торговлей 11, пользователи часто сталкиваются со странным поведением системы при печати ценников и этикеток. Вроде бы используется один и тот же шаблон, штрихкоды состоят из одинакового количества цифр (13 символов), но на печати один штрихкод выглядит компактно и аккуратно, а второй растягивается на всю ширину этикетки, обрезается по краям или вовсе отображается в виде нечитаемой полосы. При попытке жестко задать тип штрихкода как EAN13 вместо Автоопределение система выдает критическую ошибку "Invalid Barcode" или "Invalid checkdigit".

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

---

Выясняем причину: почему штрихкоды визуально отличаются

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

Когда в макете этикетки для свойства рисунка задан тип Автоопределение, компонента печати последовательно валидирует переданную строку по правилам различных мировых стандартов штрихкодирования:

  1. Случай корректного штрихкода (например, 4009990311406): Компонента проверяет длину строки (13 цифр) и высчитывает контрольное число по стандартному математическому алгоритму EAN-13. Если расчетное число совпадает с последней (13-й) цифрой переданного кода, валидация проходит успешно. На этикетку выводится стандартный штрихкод EAN-13 фиксированной плотности с привычными разделительными линиями по бокам и в центре.
  2. Случай некорректного штрихкода (например, 4000999031136): Для данной последовательности цифр правильным контрольным символом по стандарту должна быть цифра 9, а не 6. Компонента вычисляет контрольную сумму, видит несовпадение и бракует этот код как невалидный EAN-13. Но поскольку в настройках шаблона включено Автоопределение, компонента не останавливает работу, а пытается закодировать строку в другом поддерживаемом формате, не требующем жесткой структуры контрольных сумм. Чаще всего выбор падает на формат Code 128 (или Code 128C).

Результат подмены формата: Штрихкод стандарта Code 128 визуально существенно отличается от EAN-13. Он значительно шире, имеет более плотную структуру штрихов и требует гораздо больше горизонтального пространства на этикетке. В итоге некорректный штрихкод просто не помещается в рамки отведенной под него области макета, растягивается и становится нечитаемым для сканеров.

Если же в шаблоне этикетки принудительно выставить тип штрихкода EAN13, компонента не станет пытаться подобрать другой стандарт и сразу вернет ошибку "Invalid Barcode" (Неверный штрихкод) или "Invalid checkdigit" (Неверный контрольный символ).

---

Как рассчитывается контрольный символ EAN-13

Контрольная цифра (13-й символ штрихкода) предназначена для защиты от ошибок считывания сканером и ручного ввода. Она рассчитывается на основании первых 12 цифр кода по следующему алгоритму:

  1. Складываются все цифры, стоящие на четных позициях штрихкода (2-я, 4-я, 6-я, 8-я, 10-я, 12-я). Полученная сумма умножается на 3.
  2. Складываются все цифры, стоящие на нечетных позициях (1-я, 3-я, 5-я, 7-я, 9-я, 11-я).
  3. Суммируются оба полученных результата.
  4. Из полученного числа берется только цифра разряда единиц (остаток от деления на 10).
  5. Эта цифра вычитается из 10. Полученный остаток и есть контрольный символ. Если в остатке получается 10, то контрольный символ равен "0".

---

Решение проблемы: Программный расчет контрольного символа

Рассмотрим, как автоматизировать проверку и расчет контрольного символа средствами встроенного языка 1С. Напишем функцию, которая принимает на вход первые 12 цифр штрихкода и возвращает строковое представление правильной контрольной цифры.


Функция ВычислитьКонтрольныйСимволEAN13(Знач Штрихкод12Знаков) Экспорт
    
    // Проверим, что передана строка нужной длины и состоит только из цифр
    Если СтрДлина(СокрЛП(Штрихкод12Знаков)) <> 12 Тогда
        ВызватьИсключение "Для расчета контрольного символа EAN-13 строка должна содержать ровно 12 цифр!";
    КонецЕсли;
    
    СуммаЧетных = 0;
    СуммаНечетных = 0;
    
    // Цикл по всем 12 цифрам
    Для Индекс = 1 По 12 Цикл
        ТекущаяЦифра = Число(Сред(Штрихкод12Знаков, Индекс, 1));
        
        Если Индекс % 2 = 0 Тогда
            // Четная позиция
            СуммаЧетных = СуммаЧетных + ТекущаяЦифра;
        Иначе
            // Нечетная позиция
            СуммаНечетных = СуммаНечетных + ТекущаяЦифра;
        КонецЕсли;
    КонецЦикла;
    
    // Умножаем сумму четных позиций на 3
    ИтоговаяСумма = (СуммаЧетных * 3) + СуммаНечетных;
    
    // Находим остаток от деления на 10
    ОстатокОтДеления = ИтоговаяСумма % 10;
    
    // Вычисляем контрольное число
    Если ОстатокОтДеления = 0 Тогда
        КонтрольныйСимвол = 0;
    Else
        КонтрольныйСимвол = 10 - ОстатокОтДеления;
    КонецЕсли;
    
    Возврат Строка(КонтрольныйСимвол);
    
КонецФункции

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

---

Как массово исправить неверные штрихкоды в базе данных УТ 11

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

Проанализируем алгоритм исправления:

  1. Выбираем из регистра сведений все записи со штрихкодами, длина которых равна 13 символам.
  2. Для каждой записи отсекаем последний символ (получаем первые 12 цифр).
  3. Рассчитываем правильный контрольный символ с помощью нашей функции.
  4. Сравниваем исходный штрихкод с вновь сформированным (первые 12 цифр + правильный контрольный символ).
  5. Если они отличаются, производим перезапись некорректного значения штрихкода на правильное.

Рассмотрим пример кода такой обработки:


Процедура ИсправитьОшибочныеШтрихкодыНаСервере()
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод,
        |	ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура,
        |	ШтрихкодыНоменклатуры.Характеристика КАК Характеристика,
        |	ШтрихкодыНоменклатуры.Упаковка КАК Упаковка
        |ИЗ
        |	РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
        |ГДЕ
        |	ДЛИНАСТРОКИ(ШтрихкодыНоменклатуры.Штрихкод) = 13";
        
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        
        ИсходныйШК = СокрЛП(ВыборкаДетальныеЗаписи.Штрихкод);
        Первые12Цифр = Лев(ИсходныйШК, 12);
        
        Попытка
            ПравильныйКонтрольный = ВычислитьКонтрольныйСимволEAN13(Первые12Цифр);
            НовыйШК = Первые12Цифр + ПравильныйКонтрольный;
            
            Если ИсходныйШК <> НовыйШК Тогда
                
                // Найдено несовпадение контрольной цифры
                // Перезаписываем данные в регистре сведений
                МенеджерЗаписи = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
                ЗаполнитьЗначенияСвойств(МенеджерЗаписи, ВыборкаДетальныеЗаписи);
                МенеджерЗаписи.Прочитать();
                
                Если МенеджерЗаписи.Выбран() Тогда
                    // Удаляем старую запись с неверным ключом
                    МенеджерЗаписи.Удалить();
                    
                    // Создаем запись с корректным штрихкодом
                    НоваяЗапись = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
                    ЗаполнитьЗначенияСвойств(НоваяЗапись, ВыборкаДетальныеЗаписи);
                    НоваяЗапись.Штрихкод = НовыйШК;
                    НоваяЗапись.Записать(Истина);
                    
                    ЗаписьЖурналаРегистрации("Штрихкоды.Исправление",
                        УровеньЖурналаРегистрации.Информация,
                        ,
                        ,
                        "Успешно исправлен некорректный штрихкод " + ИсходныйШК + " на " + НовыйШК);
                КонецЕсли;
                
            КонецЕсли;
        Исключение
            // Обработка строк, которые содержат нецифровые символы
            ЗаписьЖурналаРегистрации("Штрихкоды.Ошибка",
                УровеньЖурналаРегистрации.Предупреждение,
                ,
                ,
                "Не удалось обработать штрихкод: " + ИсходныйШК + ". Ошибка: " + ОписаниеОшибки());
        КонецПопытки;
        
    КонецЦикла;
    
КонецПроцедуры

---

Использование встроенных механизмов БСП и БПО

Важно отметить, что в типовых конфигурациях 1С (УТ 11.4, КА 2, ERP) разработчикам нет необходимости писать функции расчета контрольной цифры полностью с нуля в каждом модуле. В составе Библиотеки подключаемого оборудования уже присутствуют готовые программные методы.

Например, можно обратиться к общему модулю МенеджерОборудованияКлиентСервер, в котором реализована функция контроля корректности штрихкода. Вызов этого метода позволяет быстро валидировать строку перед записью в базу:


// Пример проверки корректности штрихкода через БПО
ШтрихкодКорректен = МенеджерОборудованияКлиентСервер.ПроверитьШтрихкод(ПроверяемыйШтрихкод, ДанныеПараметровШтрихкода);

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

---

Как предотвратить появление таких ошибок в будущем

Для того чтобы минимизировать ручные ошибки операторов при заведении карточек товаров или импорте прайс-листов, мы рекомендуем внедрить превентивные меры контроля на уровне интерфейса 1С:

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

← На главную