Имя: Пароль:
1C
 
Никто из присутствующих не разбирался с механизмом формирования Штрихкодов?
0 Сияющий Асинхраль
 
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, т.е. вместо одного знака получаем ДВА знака. А что с этим делать неясно... Соответственно после добавления десятки к штрихкоду он оказывается слишком длинным...
1 azernot
 
16.04.21
16:25
(0) ЭМ... а разве не "0" в этом случае будет контрольной цифрой?
2 fisher
 
16.04.21
16:27
Я вот такое откуда-то выдрал:

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

(2) Спасибо!!! Так и сделаю!!!
5 fisher
 
16.04.21
17:10
Ы. Самое смешное, что я эту правку сам же и вносил, как выяснилось, в 2016.
6 MWWRuza
 
гуру
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 символьного ШК..."
- правильно написанный алгоритм будет вычислять правильно для ТАКОГО ТИПА ШТРИХКОДОВ любой длины, ибо это ОДИН ТИП ШК
9 NorthWind
 
16.04.21
21:34
в случае с SSCC возникала необходимость вычислять и для большей длины кода. Получалось.
10 Злопчинский
 
17.04.21
02:30
11 Злопчинский
 
17.04.21
02:32