Имя: Пароль:
1C
 
Формирование штрих-кода
0 Владимир1С
 
08.07.10
15:28
Киньте, плиз, ссалку на методику формирования штрихкодов. Установил баркоде, вношу число в печатную форму, печатаю - сканер не пикает. Что и как добавлять при печати?
1 ДенисЧ
 
08.07.10
15:31
Возьми типовую ТиС, там есть функция...
2 Владимир1С
 
08.07.10
15:32
по кнопочке "->" ?
3 ДенисЧ
 
08.07.10
15:33
ага
4 Владимир1С
 
08.07.10
15:36
Как раз по этой кнопке генерю, вставляю в печ форму, хоть "текст", хоть "выражение", сканер не пикает.
5 Irbis
 
08.07.10
15:37
Контрольная цифра не соответствует типу штриха, скорее всего. Поищи алгоритм формирования, запикает.
6 Tatitutu
 
08.07.10
15:38
Функция КонтрольныйСимволШК(ШтрКод)    Экспорт
   Чет        = 0;
   Нечет    = 0;
   х        = 0;
   ДлинаШК    = СтрДлина(ШтрКод);    
   Пока х < ДлинаШК Цикл
       Символ    = Сред(ШтрКод, ДлинаШК-х, 1);
       Если х%2 = 0 тогда    //    четный символ
           Чет     = Чет+ Число(Символ)
       Иначе
           Нечет= Нечет+ Число(Символ)
       КонецЕсли;
       х    = х + 1;
   КонецЦикла;    
   КонтЦифра= 10- (Нечет+ Чет*3)%10;
   Возврат ?(КонтЦифра=10, "0", Строка(КонтЦифра));
КонецФункции // глКонтрольныйСимволШК()

Функция NumberToUpperChar( Num )
   UpperCharSet = "ABCDEFGHIJ";
   Num = Число(Прав(Num,1));
   Стр = Сред(UpperCharSet, Num + 1, 1);
   Возврат Стр;
КонецФункции
Функция NumberToLowerChar( Num )
   LowerCharSet = "abcdefghij";
   Num = Число(Прав(Num,1));
   Стр = Сред(LowerCharSet, Num + 1, 1);
   Возврат Стр;
КонецФункции
Функция СформироватьКодEAN13(код)    
   // Проверки
   Если ТипЗначения(код) <> 1    Тогда
       Сообщить("Код для EAN13 должен числовым.");
       Возврат "";
   КонецЕсли;    
   Если СтрДлина(код) > 13    Тогда
       Сообщить("Код для EAN13 должен быть длинной не более 12 символов.");
       Возврат "";
   КонецЕсли;  
   //    Разбор строки
   ПервыйФлаг = Число(Сред(код,1,1));
   левстр     = Сред(код,2,6);
   правстр    = Сред(код,8,6);    
   правкод = "";
   Для Поз = 1 По 6 Цикл
       правкод = правкод + NumberToLowerChar(Сред(правстр,Поз,1));
   КонецЦикла;    
   //  Формирование левой части кода зависит от значениа ПервыйФлаг
   Если      ПервыйФлаг = 0    Тогда
       //    0           A  A  A  A  A
       левкод = "#!" + Лев(левстр,1)
       + Сред(левстр,2,1)
       + Сред(левстр,3,1)
       + Сред(левстр,4,1)
       + Сред(левстр,5,1)
       + Сред(левстр,6,1);        
   ИначеЕсли ПервыйФлаг = 1    Тогда
       //    1           A  A  B  A  B  B
       левкод = "$!"
       + Лев(левстр,1)
       + Сред(левстр,2,1)
       + NumberToUpperChar(Сред(левстр,3,1))
       + Сред(левстр,4,1)
       + NumberToUpperChar(Сред(левстр,5,1))
       + NumberToUpperChar(Сред(левстр,6,1));
       
   ИначеЕсли ПервыйФлаг = 2    Тогда
       //    2           A  A  B  B  A  B
       левкод = "%!"
       + Лев(левстр,1)
       + Сред(левстр,2,1)
       + NumberToUpperChar(Сред(левстр,3,1))
       + NumberToUpperChar(Сред(левстр,4,1))
       + Сред(левстр,5,1)
       + NumberToUpperChar(Сред(левстр,6,1));        
   ИначеЕсли ПервыйФлаг = 3    Тогда
       //    3           A  A  B  B  B  A
       левкод = "&!"
       + Лев(левстр,1)
       + Сред(левстр,2,1)
       + NumberToUpperChar(Сред(левстр,3,1))
       + NumberToUpperChar(Сред(левстр,4,1))
       + NumberToUpperChar(Сред(левстр,5,1))
       + Сред(левстр,6,1);
   ИначеЕсли ПервыйФлаг = 4    Тогда
       //    4           A  B  A  A  B  B
       левкод = "'!"
       + Лев(левстр,1)
       + NumberToUpperChar(Сред(левстр,2,1))
       + Сред(левстр,3,1)
       + Сред(левстр,4,1)
       + NumberToUpperChar(Сред(левстр,5,1))
       + NumberToUpperChar(Сред(левстр,6,1));
   ИначеЕсли ПервыйФлаг = 5    Тогда
       //    5           A  B  B  A  A  B
       левкод = "(!"
       + Лев(левстр,1)
       + NumberToUpperChar(Сред(левстр,2,1))
       + NumberToUpperChar(Сред(левстр,3,1))
       + Сред(левстр,4,1)
       + Сред(левстр,5,1)
       + NumberToUpperChar(Сред(левстр,6,1));
   ИначеЕсли ПервыйФлаг = 6    Тогда
       //    6           A  B  B  B  A  A
       левкод = ")!"
       + Лев(левстр,1)
       + NumberToUpperChar(Сред(левстр,2,1))
       + NumberToUpperChar(Сред(левстр,3,1))
       + NumberToUpperChar(Сред(левстр,4,1))
       + Сред(левстр,5,1)
       + Сред(левстр,6,1);
   ИначеЕсли ПервыйФлаг = 7    Тогда
       //    7           A  B  A  B  A  B
       левкод = "*!"
       + Лев(левстр,1)
       + NumberToUpperChar(Сред(левстр,2,1))
       + Сред(левстр,3,1)
       + NumberToUpperChar(Сред(левстр,4,1))
       + Сред(левстр,5,1)
       + NumberToUpperChar(Сред(левстр,6,1));
   ИначеЕсли ПервыйФлаг = 8    Тогда
       //    8           A  B  A  B  B  A
       левкод = "+!"
       + Лев(левстр,1)
       + NumberToUpperChar(Сред(левстр,2,1))
       + Сред(левстр,3,1)
       + NumberToUpperChar(Сред(левстр,4,1))
       + NumberToUpperChar(Сред(левстр,5,1))
       + Сред(левстр,6,1);
   ИначеЕсли ПервыйФлаг = 9    Тогда
       //    9           A  B  B  A  B  A
       левкод = ",!"
       + Лев(левстр,1)
       + NumberToUpperChar(Сред(левстр,2,1))
       + NumberToUpperChar(Сред(левстр,3,1))
       + Сред(левстр,4,1)
       + NumberToUpperChar(Сред(левстр,5,1))
       + Сред(левстр,6,1);
   КонецЕсли;
   
   // Получение строки - результата
   кодстр = левкод + "-" + правкод + "!";
   
   Возврат кодстр;
КонецФункции    //    СформироватьКодEAN13()
//*******************************************
Функция СимволыВЦифры(СтрСимв)    Экспорт
   СтрЦифр = "";
   Для х= 1 По СтрДлина(СтрСимв) Цикл
       ТекСимв = Сред(СтрСимв, х, 1);        
       Если Найти("1234567890", ТекСимв)= 0 Тогда
           // преобразуем символ в цифру
           ТекСимв = Строка(КодСимв(ТекСимв) % 10);
       КонецЕсли;        
       СтрЦифр = СтрЦифр + ТекСимв;
   КонецЦикла;    
   Возврат СтрЦифр;
КонецФункции    //    СимволыВЦифры()
//*******************************************
Функция глСформироватьШтрихкод(Префикс, ПредвКод, ТипКода=13) Экспорт
   Если ТипКода = 13 Тогда
       ИспКолво = 10;
   Иначе
       ИспКолво = 6;
   КонецЕсли;    
   Штрихкод = СимволыВЦифры(Прав(СокрЛП(ПредвКод), ИспКолво));      
   Штрихкод = Префикс + СтрЗаменить(Формат(Штрихкод, "С"+ИспКолво), " ", "0");
   Штрихкод = СформироватьКодEAN13(Число(СокрЛП(Штрихкод) + КонтрольныйСимволШК(Штрихкод)));    
   Возврат Штрихкод;
КонецФункции    //    СформироватьШтрихкод()
7 Владимир1С
 
08.07.10
15:41
(6) пошёл разбирать. Спасибо!
8 andrewalexk
 
08.07.10
15:49
(5) :) не у всех ШК есть КС...
9 Irbis
 
08.07.10
15:51
(8) Это тоже верно. Но такие ШК и не проходят аппаратную проверку, кстати тоже отключаемую, и сканер пищит после окончания считывания.
10 andrewalexk
 
08.07.10
15:53
:) ну не знаю...вот только что тестировал считывание сканером настроенным на еан-13 3 других систем шкодирования в 2 вариантах каждая - шк или сканируется или сканируется частично или не сканируется вообще
11 Владимир1С
 
08.07.10
17:21
(6) Вопрос: какой шрифт нужен для Этого алгоритма? На выходе - Буквы и символы, цифр нет.
12 Kreont
 
08.07.10
17:34
(11) EAN13.ttf
13 Kreont
 
08.07.10
17:35
(6) Странно, но у меня код по переводу компактнее в N-раз, щас найду
14 Kreont
 
08.07.10
17:41
// ======================================
// Вертає текстом контрольну цифру для ЕАН13
function EANGetCRCDigit(S) export
var x, y, z;
    if (strlen(S) <> 12) then return "-"; endif;
    x = Number(Mid(s,1,1))+Number(Mid(s,3,1))+Number(Mid(s,5,1))+Number(Mid(s,7,1))+Number(Mid(s,9,1))+Number(Mid(s,11,1));
    y = Number(Mid(s,2,1))+Number(Mid(s,4,1))+Number(Mid(s,6,1))+Number(Mid(s,8,1))+Number(Mid(s,10,1))+Number(Mid(s,12,1));
    z = x + 3*y;
    return Right(String(10 - (z % 10)),1);
endfunction
// ======================================
// Вертає стрічку для друку коду ЕАН13 шрифтом EAN
function EANGetFontCode(S) export
   var  i,t;
   Result = "";
   if (strlen(S) <> 13) then return Result; endif;
   Result = Result + Left(S,1);
   if Left(S,1) = "0" then t = "AAAAAA";
   elsif Left(S,1) = "1" then t = "AABABB";
   elsif Left(S,1) = "2" then t = "AABBAB";
   elsif Left(S,1) = "3" then t = "AABBBA";
   elsif Left(S,1) = "4" then t = "ABAABB";
   elsif Left(S,1) = "5" then t = "ABBAAB";
   elsif Left(S,1) = "6" then t = "ABBBAA";
   elsif Left(S,1) = "7" then t = "ABABAB";
   elsif Left(S,1) = "8" then t = "ABABBA";
   elsif Left(S,1) = "9" then t = "ABBABA";
   endif;        
   for i = 1 to 6 do
       if Mid(t,i,1) = "A" then
           Result = Result +  Симв(Number(Mid(s,i+1,1))+КодСимв("A"));
       endif;
       if Mid(t,i,1) = "B" then
           Result = Result + Симв(Number(Mid(s,i+1,1))+КодСимв("K"));
       endif;
   enddo;
   Result = Result + "*";
   for i = 1 to 6 do
       Result = Result + Симв(Number(Mid(s,i+7,1))+КодСимв("a"));
   enddo;
   Result = Result + "+";
   return Result;
endfunction
15 Kreont
 
08.07.10
17:44
+(14)Вызов: КодЕАННомер - на вход
КодЕАННомер = EANGetFontCode(КодЕАННомер + EANGetCRCDigit(КодЕАННомер));

П.С. Сори что код на английском 1С, переделывал из делфи :))
16 Касандер72
 
08.07.10
18:15
Можно для вычисления контрольной (13-ой) цифрры использовать сию процедуру:

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

и потом вызывать её:
Штрихкод12 = МояФормулаПолучения12знаков;
Штрихкод13 = Штрихкод12 + глКонтрольныйСимволEAN13(Штрихкод12);
17 Владимир1С
 
08.07.10
18:53
Господа, есть у кого нибудь руководство по MetroSelect на русском языке?
18 Владимир1С
 
08.07.10
20:45
Откопал на русском языке - в Украине. :)

http://www.ics-market.com.ua/ru_ruhn_lazer_odnolin_svetodiod_scaner.phtml?ai=ru_voyager_ms9520_40
19 Владимир1С
 
09.07.10
11:01
Код всё равно не читается. Формируется верно, печатается верно. Может 5 нулей в коде не принимает? . Или к нему надо что добавлять ещё? Опытные коллеги, подскажите, плиз?
20 Владимир1С
 
09.07.10
15:29
(6) up! плиз!!!
Код формирует, но он всё равно не считывается.
Код товара : 191919 , код по EAN13 : %!00BJ1J-bjaa . Сканер не читает.
21 Владимир1С
 
09.07.10
15:32
Шрифт : EanBvrP36Tt(западный)
22 Strogg
 
09.07.10
15:54
(20) - EANGnivc попробуй.
---
Ну и, как тут стало модно :-)...
Функция СимволыВЦифры(СтрСимв)
   
   СтрЦифр = "";
   
   Для Индекс = 1 По СтрДлина(СтрСимв) Цикл
       ТекСимв = Сред(СтрСимв, Индекс, 1);
       
       Если Найти("1234567890", ТекСимв) = 0 Тогда
           // преобразуем символ
           ТекСимв = Строка(КодСимвола(ТекСимв) % 10);
       КонецЕсли;
       
       СтрЦифр = СтрЦифр + ТекСимв;
   КонецЦикла;
   
   Возврат СтрЦифр;
   
КонецФункции // СтрокаВЦифры()
Функция глКонтрольныйСимволEAN(ШтрКод, Тип)
   
   Четн = 0;
   Нечетн = 0;
   
   Если Тип = 13 Тогда
       КолвоИтераций = 6;
   Иначе
       КолвоИтераций = 4;
   КонецЕсли;
   
   Для Индекс = 1 По КолвоИтераций Цикл
       Четн = Четн + Сред(ШтрКод, 2 * Индекс, 1);
       Нечетн = Нечетн + Сред(ШтрКод, 2 * Индекс - 1, 1);
   КонецЦикла;
   
   Если Тип = 13 Тогда
       Четн = Четн * 3;
   Иначе
       Нечетн = Нечетн * 3;
   КонецЕсли;
   
   КонтЦифра = 10 - (Четн + Нечетн) % 10;
   
   Возврат ?(КонтЦифра = 10, "0", Строка(КонтЦифра));
   
КонецФункции // глКонтрольныйСимволEAN()
Функция глДополнитьСтрокуЛ(Стр,Чем,Длина)
   Добавить=Длина-СтрДлина(Стр);
   Добавок="";
   Для Сч = 1 По Добавить  Цикл
       Добавок=Добавок+Чем;
   КонецЦикла;
   Возврат Добавок+Стр;
КонецФункции //глДополнитьСтрокуЛ()
Функция глДополнитьСтрокуП(Стр,Чем,Длина)
   Добавить=Длина-СтрДлина(Стр);
   Добавок="";
   Для Сч = 1 По Добавить  Цикл
       Добавок=Добавок+Чем;
   КонецЦикла;
   Возврат Стр+Добавок;
КонецФункции //глДополнитьСтрокуП()
Функция глСформироватьШтрихкод(Префикс , Код, ТипКода=13)
   
   Если ТипКода = 13 Тогда
       ИспКолво = 11;
   Иначе
       ИспКолво = 6;
   КонецЕсли;
   
   Штрихкод = СимволыВЦифры(Прав(СокрЛП(Код), ИспКолво));
   Штрихкод = Префикс + глДополнитьСтрокуЛ(Штрихкод, "0", ИспКолво);
   
   Возврат Штрихкод + глКонтрольныйСимволEAN(Штрихкод, ТипКода);
   
КонецФункции // глСформироватьШтрихкод()
23 Владимир1С
 
09.07.10
16:02
Как здесь картинку вставить?
24 Владимир1С
 
09.07.10
17:31
Уважаемые участники форума! У кого работает штрихкодирование с вояджером, дайте, плиз, характеристики печатных форм: Шрифт + тип кода , + есть ли доп обрамление звёздочками?