Вход | Регистрация
 

Никто из присутствующих не разбирался с механизмом формирования Штрихкодов?

Никто из присутствующих не разбирался с механизмом формирования Штрихкодов?
Я
   Сияющий Асинхраль
 
16.04.21 - 16:21
В ряде случаев 1С выдает некорректные штрихкоды, вместо 13-ти значных получаются 14-тизначные. Залез в код, оказалось в ряде редких случаев это получается из-за расчета контрольной цифры штрихкода. Если верить интернету эта контрольная цифра считается вот по такому простенькому алгоритму:


    Сложите цифры, находящиеся на четных местах: 2+4+6+8+0+2=22
    Полученную сумму умножьте на 3: 22*3=66
    Сложите цифры, находящиеся на нечетных местах (кроме последней, контрольной): 1+3+5+7+9+1=26
    Сложите числа, полученные в п.2 и п.3: 66+26=92
    Отбросьте десятки: 92-90=2
    Из 10 вычтите полученное в п.5: 10-2=8

В большинстве случаев все здорово, НО иногда, если на предпоследнем шаге мы получаем число нацело делящееся на десятку, т.е. скажем не 92 - 90, как в алгоритме, а 90 - 90, то на последнем шаге у нас получается контрольная цифра равной уже не цифре, а числу 10, т.е. вместо одного знака получаем ДВА знака. А что с этим делать неясно... Соответственно после добавления десятки к штрихкоду он оказывается слишком длинным...
   azernot
 
1 - 16.04.21 - 16:25
(0) ЭМ... а разве не "0" в этом случае будет контрольной цифрой?
   fisher
 
2 - 16.04.21 - 16:27
Я вот такое откуда-то выдрал:
Функция ВычислитьКонтрольныйСимвол(Штрихкод, СимволНач = 1, СимволКон = 0) Экспорт
    
    Если СимволКон = 0 Тогда
        СимволКон = СтрДлина(Штрихкод);
    КонецЕсли;
    
    Сумма = 0;
    Коэффициент = 1;
    
    Для Сч = СимволНач По СимволКон Цикл
        КодСимв = КодСимвола(Штрихкод, Сч);
        Сумма = Сумма + Коэффициент * (КодСимв - 48);
        Коэффициент = 4 - Коэффициент;
    КонецЦикла;
    
    Сумма = 10 - Сумма % 10;
    КонтрольныйСимвол = Символ(?(Сумма=10, 0, Сумма) + 48);
    
    Возврат КонтрольныйСимвол;
    
КонецФункции

   fisher
 
3 - 16.04.21 - 16:31
То бишь если 10 получается то надо как 0 считать.
   Сияющий Асинхраль
 
4 - 16.04.21 - 16:31
(1) Так вот и интересуюсь как правильно, в типовой конфе изредка получается десятка и коды неправильные. Если просто десятку поменять на ноль, то замечательно!!!

(2) Спасибо!!! Так и сделаю!!!
   fisher
 
5 - 16.04.21 - 17:10
Ы. Самое смешное, что я эту правку сам же и вносил, как выяснилось, в 2016.
   MWWRuza
 
6 - 16.04.21 - 18:21
Из старой 7.7 конфы:

Функция глКонтрольныйСимволEAN(ШтрКод, Тип) Экспорт
    
    Четн = 0;
    Нечетн = 0;
    
    Если Тип = 13 Тогда
        КолвоИтераций = 6;
    ИначеЕсли Тип = 14 Тогда
        КолвоИтераций = 7;
    Иначе
        КолвоИтераций = 4;
    КонецЕсли;
    
    Для Индекс = 1 По КолвоИтераций Цикл
        Четн = Четн + Сред(ШтрКод, 2 * Индекс, 1);
        Нечетн = Нечетн + Сред(ШтрКод, 2 * Индекс - 1, 1);
    КонецЦикла;
    
    Если Тип = 13 Тогда
        Четн = Четн * 3;
    Иначе
        Нечетн = Нечетн * 3;
    КонецЕсли;
    
    КонтЦифра = 10 - (Четн + Нечетн) % 10;
    
    Возврат ?(КонтЦифра = 10, "0", Строка(КонтЦифра));
    
КонецФункции// глКонтрольныйСимволEAN()


Умеет вычислять КС дла 8, 13 и 14 символьного ШК...
   Злопчинский
 
7 - 16.04.21 - 21:21
(6) +100! классика не умирает
   Злопчинский
 
8 - 16.04.21 - 21:21
"Умеет вычислять КС дла 8, 13 и 14 символьного ШК..."
- правильно написанный алгоритм будет вычислять правильно для ТАКОГО ТИПА ШТРИХКОДОВ любой длины, ибо это ОДИН ТИП ШК
   NorthWind
 
9 - 16.04.21 - 21:34
в случае с SSCC возникала необходимость вычислять и для большей длины кода. Получалось.
   Злопчинский
 
10 - 17.04.21 - 02:30
   Злопчинский
 
11 - 17.04.21 - 02:32

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.