gifts2017

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

Опубликовал Сергей Самошин (saiten) в раздел Программирование - Практика программирования

Функция преобразования текстового представления ШК к последовательности символов шрифта 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)
                    +
ЛевыйЗащитныйШаблон
                    + ЛеваяЧастьКода
                    + СреднийЗащитныйШаблон
                    + ПраваяЧастьКода
                    + ПравыйЗащитныйШаблон;
    Возврат
Результат;
КонецФункции

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Игорь Высоковских (via) 04.06.13 10:43
Добавь для Ean8

    СимволСпособаКодирования = "";
    ИндексСпособаКодирования = 0;

    Для ИндексСимвола = 0 По 3 Цикл
        ЛеваяЧастьКода = ЛеваяЧастьКода
            + Сред(СимволыШрифтаПоТипамКодов[Сред(СпособыКодированияЛевойЧасти[ИндексСпособаКодирования],ИндексСимвола,1)]
                    ,Число(Сред(ШтрихкодСтрокойСимволов,(ИндексСимвола+1),1))+1
                    ,1);
        ПраваяЧастьКода = ПраваяЧастьКода
            + Сред(СимволыШрифтаПоТипамКодов[Сред(СпособКодированияПравойЧасти,ИндексСимвола,1)]
                    ,Число(Сред(ШтрихкодСтрокойСимволов,(ИндексСимвола+5),1))+1
                    ,1);
    КонецЦикла;
...Показать Скрыть
2. Сергей Самошин (saiten) 04.06.13 13:48
(1) Спасибо, добавил. В принципе, предполагал что он примерно так и формируется, но проверять было лениво.
4. Макс Савостин (mc1c80) 20.09.13 14:49
Спасибо, как раз искал это.
5. Макс Савостин (mc1c80) 20.09.13 15:32
Что-то у меня не распознает сформированный штрихкод.
6. Сергей Самошин (saiten) 24.09.13 13:06
(5)Какой штрихкод пытаетесь сформировать? Проверю.
7. Илья Васильев (swimdog) 26.10.13 23:20
Переделал под 7.7. Все работает.
8. Максим Шуйский (maxpiter) 06.05.14 19:08
(7) swimdog,
Привет, поделись, пожалуйста, версией для 7ки :)
9. Антон Антон (kare) 07.05.14 11:06
10. Максим Шуйский (maxpiter) 07.05.14 11:20
(7) проехали, уже не актуально :)
11. MICK77 Владислав (MICK77) 30.06.14 17:51
(7) swimdog, Привет. Есть возможность поделиться вариантом для 7,7?
12. Павел (d0dger) 30.12.14 17:48
Во второй строке должно быть LLGLGG
burgur; saiten; +2 Ответить 1
13. Сергей Самошин (saiten) 31.12.14 09:49
(12)Действительно. Сейчас поправлю, спасибо.
14. Wall30 (Wall30) 25.03.16 13:29
Спасибо, для 8.2 отлично пригодилось ))
15. Виктор Череватенко (buddha667) 31.05.16 15:10