Как исправить ошибку «Ошибочный штрих-код!» при печати купонов и карт в 1С:Управление торговлей 10.3

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

При разработке и настройке печатных форм в конфигурации «1С:Управление торговлей 10.3» (работающей на обычных формах) программисты часто сталкиваются с необходимостью вывода штрихкодов. Типичный сценарий — печать дисконтных карт, купонов или подарочных сертификатов из справочника ИнформационныеКарты.

Иногда при попытке вывести штрихкод на печать разработчик видит в макете вместо привычной «зебры» из черных и белых полос пугающую надпись: «Ошибочный штрих-код!». Ситуация усложняется тем, что для одних карт штрихкод формируется корректно, а для других — с точно такими же параметрами — выводится ошибка.

В этой статье мы подробно разберем причины возникновения этой ошибки, детально изучим особенности работы с компонентой печати штрихкодов 1CBarCod.dll и рассмотрим два практических способа решения проблемы с кодом и примерами.

---

Выясняем причину: почему возникает ошибка «Ошибочный штрих-код!»

Для вывода графического изображения штрихкода в «1С:Предприятии 8» обычно используется специализированный ActiveX-элемент управления — «1С.V8.Печать штрих-кодов» (компонента 1CBarCod.dll). Ошибка валидации данных этой компонентой является главным источником проблемы. Проанализируем ключевые факторы, которые приводят к сбою:

  1. Использование некорректного свойства объекта. В исходном коде разработчики часто совершают ошибку, пытаясь напрямую присвоить значение свойству ТекстКода:
    Штрихкод.Рисунки.ШК.Объект.ТекстКода = ЭтотОбъект.КодКарты;
    Свойство ТекстКода (как и КонтрольныйСимвол) в ActiveX-компоненте 1С является вычисляемым и предназначено только для чтения. Запись данных в него игнорируется компонентой, либо вызывает ошибку инициализации. Передавать кодируемую строку необходимо строго в свойство Сообщение.
  2. Несоответствие стандарту EAN-13. Стандарт штрихкодирования EAN-13 жестко регламентирует длину кода: он должен состоять ровно из 13 цифр. При этом первые 12 цифр содержат информационную часть, а последняя (13-я) цифра является контрольным числом, рассчитываемым по специальному математическому алгоритму (Modulo 10). Если в справочнике информационной базы коды карт хранятся в виде 12-значных строк, компонента не сможет построить штрихкод по умолчанию, так как ожидает полноценные 13 знаков.
  3. Поведение свойства «СодержитКС» (CodeIsRaw). Если компоненте передается 12-значный код, а свойство СодержитКС (Содержит контрольный символ) установлено в значение Истина, компонента считает переданный код некорректным и выводит ошибку. Некоторые штрихкоды могут случайно напечататься успешно, если алгоритм проверки внутри старой версии библиотеки счел структуру данных допустимой, но для большинства кодов система выдаст ошибку.
  4. Геометрические размеры области штрихкода на макете. Если область (рамка) рисунка ActiveX на макете слишком узкая или низкая, компонента физически не может отрисовать штрихкод с соблюдением стандартов толщины линий. В этом случае она также вернет ошибку «Ошибочный штрих-код!».

---

Решение №1: Правильная настройка свойств компоненты 1CBarCod

Разберем самый простой и быстрый способ решения проблемы непосредственно при выводе макета на печать. Нам необходимо правильно распределить передачу параметров в объект ActiveX и отключить обязательное требование наличия контрольного символа во входящей строке.

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


Процедура Печать() Экспорт
    ТабДок = Новый ТабличныйДокумент;
    Макет = Справочники.ИнформационныеКарты.ПолучитьМакет("Печать");
    
    // Выводим шапку купона
    Шапка = Макет.ПолучитьОбласть("Шапка");
    Шапка.Параметры.Заполнить(ЭтотОбъект);
    ТабДок.Вывести(Шапка);
    
    // Получаем область со штрихкодом
    ОбластьШтрихкод = Макет.ПолучитьОбласть("Штрихкод");
    
    // Безопасное обращение к ActiveX-объекту штрихкода
    Попытка
        РедакторШК = ОбластьШтрихкод.Рисунки.ШК.Объект;
        
        // 1. Сначала обязательно устанавливаем тип кода
        РедакторШК.ТипКода = 1; // 1 соответствует типу EAN-13
        
        // 2. Указываем, что передаваемая строка НЕ содержит контрольный символ (всего 12 знаков)
        // Компонента сама рассчитает 13-й символ и допишет его на печатной форме
        РедакторШК.СодержитКС = Ложь;
        
        // 3. Передаем данные КАРТЫ строго в свойство "Сообщение" (а не ТекстКода!)
        РедакторШК.Сообщение = СокрЛП(ЭтотОбъект.КодКарты);
        
        // Дополнительные параметры визуализации (по желанию)
        РедакторШК.ОтображатьТекст = Истина; // Показывать цифры под штрихкодом
        
    Исключение
        ОбщегоНазначения.СообщитьОбОшибке("Не удалось инициализировать компоненту печати штрихкодов. Проверьте установку библиотеки 1CBarCod.dll!");
    КонецПопытки;
    
    ТабДок.Вывести(ОбластьШтрихкод);
    
    // Настройки отображения результирующего табличного документа
    ТабДок.ОтображатьСетку = Ложь;
    ТабДок.Защита = Ложь;
    ТабДок.ТолькоПросмотр = Истина;
    ТабДок.ОтображатьЗаголовки = Ложь;
    ТабДок.Показать();
КонецПроцедуры

При использовании свойства СодержитКС = Ложь компонента штрихкодирования самостоятельно берет переданные 12 цифр, рассчитывает по алгоритму контрольный символ и формирует полноценный рисунок штрихкода EAN-13, который успешно считается любым сканером на кассе.

---

Решение №2: Программный расчет контрольного символа средствами 1С

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

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

Добавим в модуль объекта вспомогательную функцию:


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

Теперь применим эту функцию в процедуре вывода печатной формы купона. В данном случае мы передаем в компоненту уже готовый, валидный 13-значный код и устанавливаем свойство СодержитКС = Истина:


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

Полезный совет: В типовой конфигурации «1С:Управление торговлей 10.3» уже есть встроенные функции для работы со штрихкодами. Чтобы не писать собственный велосипед расчета контрольного символа, вы можете использовать метод из общего модуля конфигурации:
РаботаСТорговымОборудованием.КонтрольныйСимволEAN(Код, 13).

---

Рекомендации по оформлению макета

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

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

← На главную