Имя: Пароль:
1C
1C 7.7
v7: BARCODE.OCX
0 vadim777
 
22.07.16
09:52
Самописная (не мной) конфа, генерирует штрих-код длиной 12 сим. При печати ценников/этикеток штрих-код печатается длиной 13 сим. Последний 13 символ берется как-бы ниоткуда, но закономерность заметил:
169581014000 -> 1695810140004
Т.е. штрих-код дополняется до длины 13 первым крайним справа ненулевым символом. Это делает сам barcode.ocx? Это как-бы стандарт?
1 opus70
 
22.07.16
09:56
а посмотреть генирацию штрих кода не судъба
Функция глКонтрольныйСимволEAN(ШтрКод, Тип) Экспорт
    
    Четн = 0;
    Нечетн = 0;
    
    Если Тип = 13 Тогда
        КолвоИтераций = 6;
    Иначе
        КолвоИтераций = 4;
    КонецЕсли;
    
    Для Индекс = 1 По КолвоИтераций Цикл
        Четн = Четн + Сред(ШтрКод, 2 * Индекс, 1);
        Нечетн = Нечетн + Сред(ШтрКод, 2 * Индекс - 1, 1);
    КонецЦикла;
    
    Если Тип = 13 Тогда
        Четн = Четн * 3;
    Иначе
        Нечетн = Нечетн * 3;
    КонецЕсли;
    
    КонтЦифра = 10 - (Четн + Нечетн) % 10;
    
    Возврат ?(КонтЦифра = 10, "0", Строка(КонтЦифра));
    
КонецФункции // глКонтрольныйСимволEAN()
2 opus70
 
22.07.16
09:57
Функция глСформироватьШтрихкод(Префикс, ПредвКод, ТипКода=13) Экспорт
    
    Если ТипКода = 13 Тогда
        ИспКолво = 10;
    Иначе
        ИспКолво = 6;
    КонецЕсли;
    
    Штрихкод = СимволыВЦифры(Прав(СокрЛП(ПредвКод), ИспКолво));
    Штрихкод = Префикс + глДополнитьСтрокуЛ(Штрихкод, "0", ИспКолво);
                
    Возврат Штрихкод + глКонтрольныйСимволEAN(Штрихкод, ТипКода);
                    
КонецФункции // глСформироватьШтрихкод()
3 vadim777
 
22.07.16
10:07
(2) Вопрос был не в алгоритме генерации штрикода, а в том, что barcode.ocx сам дополняет 12 символьный код до 13.
Что касается генерации, вот она:
Функция глШтрихКод(КодПартии,ЦенаПродажи) Экспорт
    Цен=СтрЗаменить(Формат(ЦенаПродажи,"Ч(0)7.2"),".","");
    Код=Строка(100000+Число(КодПартии));
    Возврат Код+Цен;
КонецФункции
4 vladmenleo
 
22.07.16
10:25
(3) Судя по коду,  что ты привел, у тебя генерится 13-ти символьный код Ч(0)7.2 дает длину 7
Код=Строка(100000+Число(КодПартии)) - дает длину 6
6+ 7 = 13
Так, что зря грешишь на barcode.ocx :)
5 vladmenleo
 
22.07.16
10:28
(4) пардон, ты точку убираешь, так,что 12 остается. Скорее всего ищи где-то в коде контрольный символ прибавляется
6 vadim777
 
22.07.16
10:28
(4) СтрЗаменить(Формат(ЦенаПродажи,"Ч(0)7.2"),".","");
7 vadim777
 
22.07.16
10:30
(5) Прошелся отладчиком. В barcode.ocx передается 12 символьный код: Таб.ТекущийОбъект.Text=лШтрихКод. Печатает 13 символов.
8 Gary417
 
22.07.16
10:33
(0) < Это как-бы стандарт?>

Это стандарт EAN13 ... _13_

последний символ контрольный вычисляющийся от основных 12
9 Это_mike
 
22.07.16
10:34
(8) настоящие пацаны стандарты не читают. они сразу лезут с вопросами на форумы.
10 vadim777
 
22.07.16
10:36
(9) Дай ссылку на стандарт настоящему пацану.
11 Злопчинский
 
22.07.16
10:37
печатай CODE128 или CODE39, а не ЕАН и не парь мозг
12 Зая Бусечка
 
22.07.16
10:39
А не контрольный ли это символ?
В настройках баркода есть такой флаг...
13 Gary417
 
22.07.16
10:41
(0) https://ru.wikipedia.org/wiki/European_Article_Number

там даже отдельно про 13 цифру есть
14 opus70
 
22.07.16
10:43
barcode лучше передавать не 12 символов а 13 т.е. нужно вычислять самому контрольный символ функцию я привел

ну или печать в code39 так как code128 не всегда читается сканерами (сканера нужно настраивать перепрограмировать)
15 vadim777
 
22.07.16
10:49
(13) Спасибо, прочитал. Для меня важен вывод, что barcode.ocx сам добавляет 13 символ, если его нет.
ПС: история вопроса. В магазине наклеили ценники со штрихкодами, в них 13 символов. В программе видны 12 символов. Когда вводишь вручную 12 символьный штрихкод, товар не находится. А если добавляешь любую цифру в конце - все норм. Разработчик накосячил, вот разгребаю.
16 DrZombi
 
гуру
22.07.16
11:09
(14) Лучше не вычислять её, а хранить как обычно :)
17 opus70
 
22.07.16
12:49
(16) ну вроде так и посоветовал что нужно хранить 13 символов а не 12  :)
18 DrZombi
 
гуру
22.07.16
14:04
(17) Так удобней. Не надо голову заворачивать, если там будет храниться что-то другое :)