Формирование штрихкода 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 не будет опубликован. Обязательные поля помечены *