среда, 22 февраля 2012 г.

EAN13 в 1С8

http://www.1c-galaxy.ru/forum4/topic476287/
http://help1c.com/faq8/best/77.html
http://www.tirika.ru/freebies/generator-shtrih-kodov/


Функция КонтрольныйСимволШК(ШтрКод) Экспорт 
Чет = 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(Число(СокрЛП(Штрихкод) + КонтрольныйСимволШК(Штрихкод))); 
Возврат Штрихкод; 
КонецФункции // СформироватьШтрихкод()

Комментариев нет:

Отправить комментарий