Имя: Пароль:
1C
1C 7.7
v7: ТИС Штрих-кодирование документов с помощью ЕАН-128
,
0 tgu82
 
14.03.18
16:55
ТИС 7.7
Стоит такая задачка: для учета собранных строк кладовщиками сделать сканирование перемещений и центра в магазины (большие довольно-таки перемещения).
В-принципе сканирование накладных и чеков давно отработано и достаточно было возможностей ЕАН-13. Но для перемещений так не проходит потому что:
1. Надо еще учитывать этаж или ангар (перемещение собирается по этажам - Центральный склад - адресный).
2. Есть такое понятие как печать группового перемещения по нескольким перемещениям сразу (тоже по этажам но строк меньше так как если в одном перемещении есть товар А и в другом тоже есть - то это не две строки сборки а одна).
И вот тут мне не хватает возможностей ЕАН-13.
1 цифра - признак того что это перемещение, 1 цифра (по какой из наших фирм),6 цифр номер, 4 цифры год - всего 12, а мне надо и этаж и как-то сформировать штрих-код если групповая печать перемещений и к тому-же контроль того что кто-то еще раз не сможет отсканировать все это заново и записать себе строки повторно.
Но как бы я с этим разобрался, а вот с тем как штрихкодировать то что больше 12 символов - подзадумался
1 Cool_Profi
 
14.03.18
16:59
А в чём проблема? barcode умеет вроде ка 128 печатать...
2 tgu82
 
14.03.18
17:05
(1) А проблема сначала в том как сформировать ШК ЕАН 128 из такой вот строки к примеру : 6,0,123356,2018,653465,2018
то есть здесь два номера перемещения (вариант групповой печати). С ЕАН-13 все просто. Кроме одной цифры что вижу то и получаю. А с ЕАН-128 не знаю. Там же есть какие-то AI и вообще как-то на основе всех симоволов ШК должна под идее контрольная сумма получиться и там еще вроде строку ШК надо в * заключать.
3 tgu82
 
14.03.18
17:09
(1) То есть нет у меня (хотя и гуглил) внятного алгоритма формирования ШК ЕАН-128 чтоб потом в обратную сторону мог его обработать.
4 mishaPH
 
модератор
14.03.18
17:09
(0) а чем вам коде 128 не катит?

кроме того если база единая. то не проще ли сделать док задание на... и его номер цифровой 11 символов (12й как признак что это не товарный код) . в доке приписать что угодно и вызывать данные дока по коду?
5 mishaPH
 
модератор
14.03.18
17:10
если не катит - используйте не еан 13 и не еан 128 а CODE 128 который даже символы текстовые можно запихать
6 tgu82
 
14.03.18
17:16
(5) ЕАН-13 и ЕАН-8 - прекрасно использую. А вот ЕАН-128 - свойства объекта я задать могу в таблице (ЕАН-128), но как мне мою строку символов в него перевести - не понятно.
Можно конечно пойти по другому пути - создать справочник (нужных мне перемещений примерно 5000 в год) и при записи такого перемещения - его дополнительный номер (код уникальный в этом справочнике) и к нему штрихкод ЕАН-13, но тогда как создать недублирующийся уникальный штрихкод - тоже вопрос и как при этом быть с печатью групповых перемещений. Думать буду
7 tgu82
 
14.03.18
17:18
(5) ШК должен начинаться на 6, последовательность остальных 11 символов не должна повторяться никогда, ну а 13-символ считается автоматом по формуле
8 uno-group
 
14.03.18
17:52
както Так
//*******************************************
//*********формирование баркода 128**********
//Если параметр цифра возвращает 1
Функция ТипСимв(КодСмв)
    Если КодСмв < 32 Тогда
        Возврат(1); //Команда
    ИначеЕсли (48 <= КодСмв) и (КодСмв<=57) Тогда
        Возврат(3); //Цифра
    Иначе
        Возврат(2); //Буква, знак
    КонецЕсли;    
КонецФункции

Функция Мод(Ч,З)
    Возврат(Ч-Цел(Ч/З)*З);
КонецФункции

Функция БарКод(Вход,БазаМодеС=6)
    АскиБар =                                      
//     0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
    "155515551449485845458494854548584944056416452065425461560506542164524212245605641254614650"+ //29
    "11919191108980988109881889018890898001:0928120290:18212211829021281:0122209281:01218290:10"+ //59
    "2305<0;0004=0<540=4<1<05<4105<0=441<4=0<14<50=4050<320=04830047407443074434470344704740113"+ //89
    "13131100;0838030380;0308380023032203302";//102

    ВыхТ = СоздатьОбъект("ТаблицаЗначений");
    ВыхТ.НоваяКолонка("А",,,,"Аск",4); //Аски код

    //Фильтр пустого входа
    Если Вход = "" Тогда Возврат(""); КонецЕсли;
    
    //Очищаем выход
    ВыхТ.УдалитьСтроки();
    
    Дл = СтрДлина(СокрЛП(Вход));
    
    //Разборки со стартовым кодом
    //Принимаем решение о смене подсистемы кодирования "моде" (А-1, В-2, С-3)
    //Анализируем тип двух первых символов
    ТекСимв = КодСимв(Сред(Вход,1,1));
    ТипТекСимв = ТипСимв(ТекСимв);
    Если Дл > 1 тогда
        СлСимв  = КодСимв(Сред(Вход,2,1));
        ТипСлСимв = ТипСимв(СлСимв);
    Иначе
        ТипСлСимв = 2;
    КонецЕсли;
    Моде = ТипТекСимв;
    Если (ТипТекСимв = 3) и (ТипСлСимв = 3) тогда Моде = 3; КонецЕсли;
    
    //В выходную таблицу добавляем символ старта подсистемы
    ВыхТ.НоваяСтрока();
    ВыхТ.А = 102 + Моде;
    Вых = Симв(64 + Моде);    
    //Анализируем входные символы
    Для Сч = 1 по  Дл Цикл
        ТекСимв = КодСимв(Сред(Вход,Сч,1));
        Если ТекСимв > 127 тогда
            Сообщить("Символ № "+Сч+ " со значением="+ ТекСимв+" не разрешен в штрихкоде");
            Продолжить;
        КонецЕсли;    
        ТипТекСимв = ТипСимв(ТекСимв);
        
        //Принимаем решение о смене подсистемы кодирования (моде).
        Если ТипТекСимв <> Моде тогда
            Если ТипТекСимв < 3 Тогда
                //Нужно менять моде либо с А на В, либо с В на А
                ВыхТ.НоваяСтрока();
                Если Моде = 1 тогда
                    ВыхТ.А = 100;   //Переключаемся из А в В
                Иначе    
                    ВыхТ.А = 101;    //Переключаемся из В в А
                КонецЕсли;
                Моде = ТипТекСимв;
            Иначе
                //Находимся в моде А или В, встретили цифру.
                //Прикидываем, стоит ли переключаться в МодеС
                //Смотрим на БазаМодеС знаков вперед.
                //Оптимально, БазаМодеС = 6 (См. описание)
                ДлМ = ?(Дл < Сч+БазаМодеС-1, Дл, Сч+БазаМодеС-1);
                СчЦ = 0;
                Для СчМ = Сч по ДлМ Цикл
                    МодМ = ТипСимв(КодСимв(Сред(Вход,СчМ,1)));
                    
                    //Если цифра - смотрим дальше
                    Если МодМ = 3 тогда
                        СчЦ = СчЦ+1;
                        Продолжить;
                    Иначе
                        СчЦ = 0;
                        Прервать;
                    КонецЕсли;
                КонецЦикла;
                //Если нужно переключится в С
                Если СчЦ - БазаМодеС = 0 тогда
                    Моде = 3;
                    ВыхТ.НоваяСтрока();
                    ВыхТ.А = 99;   //Переключаемся из А или В в С
                КонецЕсли;
            КонецЕсли;        
        КонецЕсли;        
        
        //Добавляем очередной символ
        
        //Если символ в МодеС
        Если Моде = 3 тогда
            СлСимв  = КодСимв(Сред(Вход,Сч+1,1));
            ТипСлСимв = ТипСимв(СлСимв);
            //Если входная строка кончается на первой цифре, или
            //конец входной строки цифра+не цифра
            Если (Сч = Дл) или (ТипТекСимв <> 3) или (ТипСлСимв <> 3) тогда
                //Переключаемся из режима С в режим В
                Моде = 2;
                ВыхТ.НоваяСтрока();
                ВыхТ.А = 100;  
            Иначе
                //Добавляем символ в МодеС
                Если (ТипТекСимв <> 3) или (ТипСлСимв <> 3) тогда
                    Сообщить("Ош."+ Сч+" "+ ТекСимв+" "+СлСимв);
                Иначе    
                    ВыхТ.НоваяСтрока();
                    ВыхТ.А = Число(Симв(ТекСимв)+Симв(СлСимв));
                    Сч = Сч+1;
                    Продолжить;
                КонецЕсли;
            КонецЕсли;    
        КонецЕсли;
        
        //Добавляем символ в МодеА, или МодеВ
        ВыхТ.НоваяСтрока();
        Если Моде = 1 тогда
            ВыхТ.А = ТекСимв+64;
        Иначе
            ВыхТ.А = ТекСимв-32;
        КонецЕсли;    
    КонецЦикла;
    //Считаем контрольную сумму и формируем баркод
    ВыхТ.ВыбратьСтроки();
    Сум = 0;
    Ном = 0;
    Пока ВыхТ.ПолучитьСтроку() = 1 Цикл
        Если Ном > 0 тогда
            Сум = Мод(Сум+ВыхТ.А*Ном,103);
            Вых = Вых+Сред(АскиБар,(ВыхТ.А+1)*3-2,3);
        Иначе    
            Сум = Мод(ВыхТ.А,103);
        КонецЕсли;
        Ном = Ном+1;
    КонецЦикла;
    Возврат(Вых+Сред(АскиБар,(Сум+1)*3-2,3)+"@");
КонецФункции
//*******************************************
9 uno-group
 
14.03.18
17:54
Шрифт "Barcode"
БарКодСтр=БарКод(ШКод,6);
10 tgu82
 
14.03.18
21:32
(9)Спасибо. разбираюсь.
(4) Ну вот префикс у меня не цифровые в документах хотя можно это дело и изменить
11 spectre1978
 
14.03.18
22:05
(0) EAN вам не нужен. Берете CODE128 и заполняете его чем хотите и как хотите, ограничения только физические на размер кода и используемые символы.
12 mishaPH
 
модератор
14.03.18
23:00
(10) (6) вы слишком загоняетесь. полно форматов кодов даже в шатном баркоде.. не понимаю, почему не использовать коде128 А,В,С он предназначен для этого по сути
13 Злопчинский
 
15.03.18
01:49
14 ADirks
 
15.03.18
08:15
(13) да ну, по моему вариант со справочником, который ты предложил, гораздо лучше. В тот же ЕАН13 можно запихать какую угодно информацию, и на всё хватит.

принцип такой: делаем справочник примерно такой структуры
- ШК (или в код, или в наименование)
- ссылка на документ
- ссылка на фирму
- ссылка на позицию
- всё что угодно ещё

Для получения ШК добавляем запись в справочник, заполняем поля, а сам ШК генерим на основе ID элемента. ID в десятеричной системе можно выколупать из строки ЗначениеВСтрокуВнутр(спрШК.ТекущийЭлемент()).
Я ещё первые 2 цифры под префикс отвожу, по которму можно понять, чего это мы такое щас отсканировали. Но можно и без префикса, если получше подумать.
15 dmitryds
 
15.03.18
08:57
(2) CODE128, потом для себя пишете, - первые 8 символов - это код склада, следующие 4 - это стеллаж и т.д. Можно завязаться на количество символов или на символ-разделитель (точка с запятой или другой символ).
Делается две функции, одна кодирует по параметрам шк, другая из шк возвращает список значений со всеми параметрами.
16 tgu82
 
15.03.18
10:00
(15) Ну правильно, поставлю в свойствах code128 а дальше? Как кодировать чтобы сканер шк это понял. Вот в этом у меня проблема. Я так понимаю что ШК по code128 как-то структурирован и как-то по контрольным суммам проверяется. Чтоб потом я мог его распознанный сканером шк разузловать в список значений.
17 Кирпич
 
15.03.18
10:01
ну прилепи два кода
18 tgu82
 
15.03.18
10:02
(15) пусть код склада "00001444", стеллаж "0016". Как создать ШК по code128?
19 Кирпич
 
15.03.18
10:02
сверху и снизу
20 tgu82
 
15.03.18
10:03
(19) А можно подробнее. Никогда с таким не сталкивался. Интересно очень, два кода - это 20 свободных цифр - мне бы хватило с лихвой
21 Кирпич
 
15.03.18
10:04
(20) подробнее нету. только что придумал.
22 Кирпич
 
15.03.18
10:05
а сверху и снизу - это чтобы два раза один и тот же код не сканировали
23 Кирпич
 
15.03.18
10:09
ну или побитно кодируй. первый бит - перемещение или нет и т.д.
два байта на год пойдет, например.
24 Кирпич
 
15.03.18
10:10
короче всё влезет и так.
25 Кирпич
 
15.03.18
10:28
1 байт - признак того что это перемещение, 1 байт - фирма (255 фирм), 2 байта - номер (65535 номеров), 1 байт год (255 лет), 1 байт - этаж (255 этажей)

6 байт. вроде всё влазит
26 Кирпич
 
15.03.18
10:29
можно первые два байта в один запихнуть. у вас же не 255 фирм
27 tgu82
 
15.03.18
10:30
(25) Да как сканер это поймет?
28 Кирпич
 
15.03.18
10:32
(25) сканер то тут при чем. он число считывает и всё. а ты уже это число кодируй раскодируй как хочешь. можешь рядом со штрихкодом печатать человекочитаемое типа 1,2,56235,18,3
29 tgu82
 
15.03.18
10:36
(28) А понял, ты имеешь в виду двоичное исчисление что ли?
30 Кирпич
 
15.03.18
10:41
(29) ну типа того. 16 ричное наверное
например 1,2,56235,18,3 будет
01 02 DB AB 12 03
штрихкод будет 1111786983939
31 mishaPH
 
модератор
15.03.18
10:46
(18)
КОд будет такой
W00001444C0016

читаешь код что с W до C код склада, с С до.. след метки еще что то
32 Злопчинский
 
15.03.18
10:48
(18) ШК = "00001444#0016"
и не мучай (зачеркунто)сношай нам мозги ;-0
засунь это обычным образом ТОЧНО ТАК ЖЕ КАК ЕАН13 в печатаемый штрихкод и все.
потом считаешь ШК по разделителю вытащишь части если они переменной длины.
33 tgu82
 
15.03.18
10:48
(31) Спасибо А почему с W до C а если у меня еще 5 групп чисел - как тогда?
34 Злопчинский
 
15.03.18
10:49
(27) сканеру похрен. он считал набор символов и отдал наружу. все. ему ничего никак понимать не надо. разбор шК сам делаешь
35 mishaPH
 
модератор
15.03.18
10:49
(33) ну разделяй буквами сколько угодно полей

W от слова склад на англ
36 mishaPH
 
модератор
15.03.18
10:50
коде128А это буквенно цифровая комбинация.
37 Злопчинский
 
15.03.18
10:53
(33) у себя на складе на самописке я делал так: т.к. инвентаризация паллетных верхов - дело затратное, то на плановой инвентаризации паллеты с товаром считаем БЫСТРО
потому что медленно и тщательно считаем их заблаговременно: когда есть время едет штабелерщик со счетчиком, посчитали паллету, жмак, на принтере шк вылазит этикетка со всякой полезной инфой кто что когда и прочее и штрихкод в виде
АртикулТовара#ШКкороба#КоличествоБазовое. и все. лепят леблу на паллету. на плановой инвентаризации жмак по этому ШК, разобрал на части и зафиксировал
38 tgu82
 
15.03.18
10:53
(34) Да не прав ты.
Сканер сканирует белые и черные полосы - так вот чтоб он сканировал ему надо такой ШК напечатать в этих полосах. Я использую для еан-13 и еан-8 баркоде и он мне в печатную форму выдает готовый к сканированию напечатанный штрихкод. И тут все понятно. А вот как баркоде поймет что то что я ему нарисовал - это штрихкод - большой вопрос. Если я неправильно формирую ШК то он просто ничего не напечатает
39 tgu82
 
15.03.18
10:55
(37) И какой стандарт ШК ты используешь?
40 Кирпич
 
15.03.18
11:01
(38) " Если я неправильно формирую ШК то он просто ничего не напечатает"
ну так ты формируй правильно
41 tgu82
 
15.03.18
11:03
(40) Для того что формировалось правильно, должны при формировании соблюдены правила. Для ЕАН-13 и ЕАН-8 я их знаю. А для code128 я их не знаю.
42 Кирпич
 
15.03.18
11:04
вот чо вычитал

Коды EAN-8 и EAN-13 используются не только изготовителями, но и продавцами для внутрифирменной маркировки. Особенностью такого кодирования является то, что считывание этих кодов осуществляется только при товародвижении внутри организации. В этом случае коды EAN-8 начинаются с нуля, а EAN-13 c двойки. Крупные торговые фирмы могут сами производить внутримагазинное кодирование.
43 tgu82
 
15.03.18
11:05
(42) Спасибо. Да, я об этом знаю. Но с ЕАН-13 и ЕАН-8 нет проблем. Просто мне их длины не хватает, но сейчас я стал смотреть побитное кодирование
44 Kondarat
 
15.03.18
11:09
(43) В (31) и (32) тебе уже все разжевали. Не надо тут ни какого побитного кодирования. А чтобы "А вот как баркоде поймет что то что я ему нарисовал - это штрихкод - большой вопрос. Если я неправильно формирую ШК то он просто ничего не напечатает" не случилось задавай своему баркоде правильный тип кода и полосочки он напечатает и сканер эти полосочки поймет.
45 tgu82
 
15.03.18
11:14
(44) попробую. просто на еан-13 зациклился, много лет все пашет, а с code128 дел никогда не имел.
46 Kondarat
 
15.03.18
11:16
(45) Расцикливайся, там все проще: буквы и цифры. Никаких тебе контрольных символов.
47 tgu82
 
15.03.18
11:18
(46) Просто размер штрихкода получается большой, думаем вообще отдельно печатать его на принтере этикеток. ЕАН-13 же компактный
48 Кирпич
 
15.03.18
11:26
а code128 может считываться с ошибками чтоли?
49 tgu82
 
15.03.18
11:27
(48) А вот не знаю. Может может с ошибками если сильно длинный. Попробую скажу
50 Злопчинский
 
15.03.18
11:28
(39) CODE128 - в зависимости от ситуации A B C
code39 тоже юзаю, но он широкий
.
и нормально все считывается
51 tgu82
 
15.03.18
11:33
(50) Что значит в зависимости от ситуации? От чего зависит тип ШК?
52 tgu82
 
15.03.18
11:36
(50) Есть же просто code128 без a,b,c
53 tgu82
 
15.03.18
12:02
(50) Ну да, понятно. мне бы хватило по идее цифрового кода безо всяких разделителей с фиксированной максимальной длиной
54 Кирпич
 
15.03.18
12:07
(53) в EAN-13 не влазит всё таки?
55 uno-group
 
15.03.18
12:14
Приведеный мной в 8 код кодирует английский алфавит и цыфры.
В один штрихкод я 25 знаков запихивал вообще непонимаю ваших проблем если место есть под штрих код хоть предложениями пишите.
56 uno-group
 
15.03.18
12:19
Кинул в качестве параметра строку из 2 вывел штрих код напечатал отсканировался со всеми запятыми и цифрами. чем полемику разводить может проще попробывать за 2 минуты
57 uno-group
 
15.03.18
12:21
по ширине занял 15 см тумаю вполне можно не снижая читабельности уменьшить до 8
58 tgu82
 
15.03.18
12:25
(56) Ну да, запятые и не нужны, уж как-нибудь разберу шк
59 dmitryds
 
15.03.18
13:18
(58) запятые и т.п. спецсимволы сильно упрощают дело... например сразу в список значений конвертнуть по разделителю... и все.. фиксированный номер элемента означает фиксированный тип значения и не надо заниматься подсчетом количества символов.
60 Злопчинский
 
15.03.18
16:37
развели бодягу
61 tgu82
 
16.03.18
09:31
(60) При чем тут бодяга? я всегда понимал так что штрихкод имеет контрольную цифру или что-то в этом роде. И если выбран тип шк и алгоритм его формирования неверен то никакогго ШК не будет напечатано а значит нечего и сканировать. Но вот да, с code128 все несколько по-другому получается
62 Кирпич
 
16.03.18
09:41
(61) ага. в code128 можно стадо слонов запихать и ничего ему не будет
63 Кирпич
 
16.03.18
09:45
Кстати. Вчера экспериментировал как всё запихать в 12 знаков для EAN13

&НаКлиенте
Функция Код(Зн,знач Байт)
    Р = DecToAny(Зн,16);
    Д = СтрДлина(Р);
    Байт = Байт * 2;
    Если Д < Байт Тогда
        Для а = 1 по Байт - Д Цикл
            Р = "0" + Р;
        КонецЦикла;
    КонецЕсли;
    возврат Р;
КонецФункции


&НаКлиенте
Функция Кодируй(ЭтоПеремещение,Фирма,Номер,Год,Этаж)
    П = ?(ЭтоПеремещение = 1,128,0);
    Р = Код(П + Фирма,1);
    Р = Р + Код(Номер,2);
    Р = Р + Код(Год,1);
    Р = Р + Код(Этаж,1);
    возврат AnyToDec(Р,16);
КонецФункции

&НаКлиенте
Функция ДеКодируй(знач Зн, ЭтоПеремещение,Фирма,Номер,Год,Этаж)
    Зн = Код(Зн,5);
    Б = AnyToDec(Сред(Зн,1,2),16);
    ЭтоПеремещение = ?(Б > 127,1,0);
    Фирма = ?(ЭтоПеремещение = 0,Б,Б-128);
    Номер = AnyToDec(Сред(Зн,3,4),16);
    Год = AnyToDec(Сред(Зн,7,2),16);
    Этаж = AnyToDec(Сред(Зн,9,2),16);
    Возврат Зн;
КонецФункции
64 Кирпич
 
16.03.18
09:46
65 Кирпич
 
16.03.18
09:49
но думаю проще и правильнее использовать code128
66 tgu82
 
16.03.18
09:51
(64) Спасибо. У меня ТИС 7.7 но в-принципе это не играет роли. Ну да, code128 удобнее намного при условии что он без ошибок читается сканером. Проверяю
67 Кирпич
 
16.03.18
09:54
(66) ну в code128 прямо в картнке вставлены контрольные числа, а в EAN13 нужно самому вычислять контрольную цифру. так что всё путём.
68 tgu82
 
16.03.18
10:02
(67) Объясни пожалуйста каким образом вставлены контрольные чиссла и что с ними делать. Для ЕАН-13 то все поняятно и работает много лет уже
69 Кирпич
 
16.03.18
10:04
(68) ну в википедии всё написано вроде. да и нафиг оно тебе надо. всё работает. просто кодируй и печатай.
70 tgu82
 
16.03.18
10:10
(69) Ну чтобы понимать что и почему а не быть бараном :)
71 Кирпич
 
16.03.18
10:12
(70) хочешь собственным глазом научиться сканировать? круто.
72 tgu82
 
16.03.18
10:19
(71) Да нет, ну есть же длл, значит есть алгоритм работы с ШК. Для ЕАН-13 все понятно, а с другими дела не имел, а теперьп получается понадобилось
73 Кирпич
 
16.03.18
10:20
(72) ну как бы всё выяснили уже. какие проблемы то.