Формирование штрихкода EAN-13 шрифтом EanGnivc

Функция преобразования текстового представления ШК к последовательности символов шрифта EanGnivc

Способ кодирования каждого символа штрихкода по алгоритму EAN зависит не только от его значения, но и от положения. Таким образом, для вывода штрихкода шрифтом EanGnivc,  недостаточно указать шрифт — штрихкод должен быть преобразован из текстового представления «2880000004097» в строку вида «%!88AA0A-aaeajh!». Что и делает представленная функция.

upd

Добавил поддержку формирования EAN-8

Функция СформироватьСтрокуEanGnivc(ШтрихкодСтрокойСимволов) Экспорт
    Попытка
       
Тест = Число(ШтрихкодСтрокойСимволов);
    Исключение
        ВызватьИсключение
«Штрихкод может содержать только цифры»;
    КонецПопытки;

    СимволыСпособовКодирования = «#$%&'()*+,»;
   
ЛевыйЗащитныйШаблон = «!»;
   
СреднийЗащитныйШаблон = «-«;
   
ПравыйЗащитныйШаблон = «!»;

    СимволыШрифтаПоТипамКодов = Новый Соответствие;
   
СимволыШрифтаПоТипамКодов.Вставить(«L», «0123456789»);
   
СимволыШрифтаПоТипамКодов.Вставить(«G», «ABCDEFGHIJ»);
   
СимволыШрифтаПоТипамКодов.Вставить(«R», «abcdefghij»);

    СпособыКодированияЛевойЧасти = Новый Массив;
   
СпособыКодированияЛевойЧасти.Добавить(«LLLLLL»);
   
СпособыКодированияЛевойЧасти.Добавить(«LLGLGG»);
   
СпособыКодированияЛевойЧасти.Добавить(«LLGGLG»);
   
СпособыКодированияЛевойЧасти.Добавить(«LLGGGL»);
   
СпособыКодированияЛевойЧасти.Добавить(«LGLLGG»);
   
СпособыКодированияЛевойЧасти.Добавить(«LGGLLG»);
   
СпособыКодированияЛевойЧасти.Добавить(«LGGGLL»);
   
СпособыКодированияЛевойЧасти.Добавить(«LGLGLG»);
   
СпособыКодированияЛевойЧасти.Добавить(«LGLGGL»);
   
СпособыКодированияЛевойЧасти.Добавить(«LGGLGL»);

    СпособКодированияПравойЧасти = «RRRRRR»;

    Если СтрДлина(ШтрихкодСтрокойСимволов) = 13 Тогда
       
КоличествоСимволовВГруппе = 6;
    ИначеЕсли
СтрДлина(ШтрихкодСтрокойСимволов) = 8 Тогда
       
КоличествоСимволовВГруппе = 4;
       
СимволыСпособовКодирования = «»;
       
ШтрихкодСтрокойСимволов = «0»+ШтрихкодСтрокойСимволов;
    Иначе
        ВызватьИсключение
«Поддерживаются только штрихкоды длиной 13 и 8 символов»;
    КонецЕсли;

    ИндексСпособаКодирования = Число(Лев(ШтрихкодСтрокойСимволов,1));

    ЛеваяЧастьКода = «»;
   
ПраваяЧастьКода = «»;

    Для ИндексСимвола = 1 По КоличествоСимволовВГруппе Цикл
       
ЛеваяЧастьКода = ЛеваяЧастьКода
            + Сред(СимволыШрифтаПоТипамКодов[Сред(СпособыКодированияЛевойЧасти[ИндексСпособаКодирования],ИндексСимвола,1)]
                    ,
Число(Сред(ШтрихкодСтрокойСимволов,(ИндексСимвола+1),1))+1
                   
,1);
       
ПраваяЧастьКода = ПраваяЧастьКода
            + Сред(СимволыШрифтаПоТипамКодов[Сред(СпособКодированияПравойЧасти,ИндексСимвола,1)]
                    ,
Число(Сред(ШтрихкодСтрокойСимволов,(ИндексСимвола+КоличествоСимволовВГруппе+1),1))+1
                   
,1);
    КонецЦикла;

    Результат = «»  + Сред(СимволыСпособовКодирования,ИндексСпособаКодирования+1,1)
                    +
ЛевыйЗащитныйШаблон
                    + ЛеваяЧастьКода
                    + СреднийЗащитныйШаблон
                    + ПраваяЧастьКода
                    + ПравыйЗащитныйШаблон;
    Возврат
Результат;
КонецФункции

17 Comments

  1. via

    Добавь для Ean8

    СимволСпособаКодирования = «»;
    ИндексСпособаКодирования = 0;
    
    Для ИндексСимвола = 0 По 3 Цикл
    ЛеваяЧастьКода = ЛеваяЧастьКода
    + Сред(СимволыШрифтаПоТипамКодов[Сред(СпособыКодированияЛевойЧасти[ИндексСпособаКодирования],ИндексСимвола,1)]
    ,Число(Сред(ШтрихкодСтрокойСимволов,(ИндексСимвола+1),1))+1
    ,1);
    ПраваяЧастьКода = ПраваяЧастьКода
    + Сред(СимволыШрифтаПоТипамКодов[Сред(СпособКодированияПравойЧасти,ИндексСимвола,1)]
    ,Число(Сред(ШтрихкодСтрокойСимволов,(ИндексСимвола+5),1))+1
    ,1);
    КонецЦикла;
    

    Показать

    Reply
  2. saiten

    (1) Спасибо, добавил. В принципе, предполагал что он примерно так и формируется, но проверять было лениво.

    Reply
  3. mc1c80

    Спасибо, как раз искал это.

    Reply
  4. mc1c80

    Что-то у меня не распознает сформированный штрихкод.

    Reply
  5. saiten

    (5)Какой штрихкод пытаетесь сформировать? Проверю.

    Reply
  6. swimdog

    Переделал под 7.7. Все работает.

    Reply
  7. maxpiter

    (7) swimdog,

    Привет, поделись, пожалуйста, версией для 7ки 🙂

    Reply
  8. kare

    спасибо!

    Reply
  9. maxpiter

    (7) проехали, уже не актуально 🙂

    Reply
  10. MICK77

    (7) swimdog, Привет. Есть возможность поделиться вариантом для 7,7?

    Reply
  11. d0dger

    Во второй строке должно быть LLGLGG

    Reply
  12. saiten

    (12)Действительно. Сейчас поправлю, спасибо.

    Reply
  13. Wall30

    Спасибо, для 8.2 отлично пригодилось ))

    Reply
  14. buddha667

    Мой поклон!

    Reply
  15. Voblhned

    Долго искал и долго мучал, а подскажи как генерировать код типа «2880000004097», есть ли у тебя генератор на основе guid например ?

    Reply
  16. saiten

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

    Reply
  17. wetsock

    Написал небольшой отчет, который выводит выбранную номенклатуру с всеми штрихкодами и их версий в EanGnivc (УТ 11.1).

    Вдруг кому-то пригодится

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *