0
AlteZ
20.03.12
✎
05:04
|
1CBarCod.dll сожрал всю память
сделал печать 13-значных шк через eangnivc.ttf,
а как быть с кодами печатных изданий длины 13+2, 13+4, 13+5 ?
// Дополнения для ШК
Функция ТолькоЦифры(Штрихкод)
Для Сч = 1 По СтрДлина(Штрихкод) Цикл
Символ = Сред(Штрихкод, Сч, 1);
Если НЕ(Найти("0123456789", Символ)) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Функция КонтрольныйСимвол_EAN(ШтрихКод,Тип) Экспорт
Четн = 0;
Нечетн = 0;
КоличествоИтераций = ?(Тип = 13, 6, 4);
Для Индекс = 1 По КоличествоИтераций Цикл
Если (Тип = 8) и (Индекс = КоличествоИтераций) Тогда
Иначе
Четн = Четн + Сред(ШтрихКод, 2 * Индекс, 1);
КонецЕсли;
Нечетн = Нечетн + Сред(ШтрихКод, 2 * Индекс - 1, 1);
КонецЦикла;
Если Тип = 13 Тогда
Четн = Четн * 3;
Иначе
Нечетн = Нечетн * 3;
КонецЕсли;
КонтЦифра = 10 - (Четн + Нечетн) % 10;
Возврат ?(КонтЦифра = 10, "0", Строка(КонтЦифра));
КонецФункции
Функция Проверить_ШтрихКод(ШтрихКод)
ДлинаКода = СтрДлина(Штрихкод);
Если ДлинаКода = 0 Тогда
Возврат Ложь;
ИначеЕсли ТолькоЦифры(Штрихкод) Тогда // штрих-код должен состоять из цифр
Если ДлинаКода = 13 Тогда
Если КонтрольныйСимвол_EAN(Лев(Штрихкод,12), 13) <> Прав(Штрихкод, 1) Тогда
Возврат Ложь;
КонецЕсли;
ИначеЕсли ДлинаКода = 8 Тогда
Если КонтрольныйСимвол_EAN(Лев(Штрихкод, 7), 8 ) <> Прав(Штрихкод, 1) Тогда
Возврат Ложь;
КонецЕсли;
Иначе
Возврат Ложь;
КонецЕсли;
Иначе
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
Функция ПолучитьКомбинацию(ИсхЧисло,Тип="X",НижнееРасположение=Истина)
// Символы из таблицы для нижнего расположения
// по типам
Если НижнееРасположение Тогда
Если Тип = "A" Тогда
Возврат(Строка(ИсхЧисло));
ИначеЕсли Тип = "B" Тогда
Возврат(Символ(ИсхЧисло + 65));
ИначеЕсли Тип = "C" Тогда
Возврат(Символ(ИсхЧисло + 97));
// Для первого знака без символов ШК только для нижнего положения
Иначе
Возврат(Символ(ИсхЧисло + 35));
КонецЕсли;
Иначе
Если Тип = "A" Тогда
Возврат(Символ(ИсхЧисло + 107));
ИначеЕсли Тип = "B" Тогда
Возврат(Символ(ИсхЧисло + 75));
ИначеЕсли Тип = "C" Тогда
Если ИсхЧисло < 5 Тогда
Возврат(Символ(ИсхЧисло + 86));
Иначе
Возврат(Символ(ИсхЧисло + 118 - 5));
КонецЕсли;
// Для первого знака без символов ШК пусто :-) лень рисовать шрифт
Иначе
Возврат(Символ(32));
КонецЕсли;
КонецЕсли;
КонецФункции
Функция ПроверитьКод(ШтрихКод, Тип)
Четн = 0;
Нечетн = 0;
КоличествоИтераций = ?(Тип = 13, 6, 4);
Для Индекс = 1 По КоличествоИтераций Цикл
Если (Тип = 8) и (Индекс = КоличествоИтераций) Тогда
Иначе
Четн = Четн + Сред(ШтрихКод, 2 * Индекс, 1);
КонецЕсли;
Нечетн = Нечетн + Сред(ШтрихКод, 2 * Индекс - 1, 1);
КонецЦикла;
Если Тип = 13 Тогда
Четн = Четн * 3;
Иначе
Нечетн = Нечетн * 3;
КонецЕсли;
КонтЦифра = 10 - (Четн + Нечетн) % 10;
Если КонтЦифра = 10 Тогда КонтЦифра = 0; КонецЕсли;
Возврат ?(Число(Прав(ШтрихКод,1)) = КонтЦифра, 11, КонтЦифра);
КонецФункции
Функция ПреобразованиеШК(ШК,ЦифрыВнизу=Истина)
СтрокаШК ="";
// Только для EAN8
Если СтрДлина(ШК) = 8 Тогда
СтрокаШК =
"!" +
ПолучитьКомбинацию(Число(Сред(ШК,1,1)),"A",ЦифрыВнизу) +
ПолучитьКомбинацию(Число(Сред(ШК,2,1)),"A",ЦифрыВнизу) +
ПолучитьКомбинацию(Число(Сред(ШК,3,1)),"A",ЦифрыВнизу) +
ПолучитьКомбинацию(Число(Сред(ШК,4,1)),"A",ЦифрыВнизу) +
"-" +
ПолучитьКомбинацию(Число(Сред(ШК,5,1)),"C",ЦифрыВнизу) +
ПолучитьКомбинацию(Число(Сред(ШК,6,1)),"C",ЦифрыВнизу) +
ПолучитьКомбинацию(Число(Сред(ШК,7,1)),"C",ЦифрыВнизу) +
ПолучитьКомбинацию(Число(Сред(ШК,8,1)),"C",ЦифрыВнизу) +
"!";
Возврат(СтрокаШК);
// Только EAN13
ИначеЕсли СтрДлина(ШК) = 13 Тогда
// Для печати цифр внизу ШК
Если ЦифрыВнизу Тогда
СтрокаШК =
ПолучитьКомбинацию(Число(Сред(ШК,1,1))); //13
КонецЕсли;
СтрокаШК = СтрокаШК + "!";
СтрокаШК = СтрокаШК +
ПолучитьКомбинацию(Число(Сред(ШК,2,1)),"A",ЦифрыВнизу); //12
Если Число(Сред(ШК,1,1)) < 4 Тогда //11
СтрокаШК = СтрокаШК +
ПолучитьКомбинацию(Число(Сред(ШК,3,1)),"A",ЦифрыВнизу);
Иначе
СтрокаШК = СтрокаШК +
ПолучитьКомбинацию(Число(Сред(ШК,3,1)),"B",ЦифрыВнизу);
КонецЕсли;
//10
Если ((Число(Сред(ШК,1,1)) = 0) ИЛИ
(Число(Сред(ШК,1,1)) = 4) ИЛИ
(Число(Сред(ШК,1,1)) = 7) ИЛИ
(Число(Сред(ШК,1,1)) = 8)) Тогда
СтрокаШК = СтрокаШК +
ПолучитьКомбинацию(Число(Сред(ШК,4,1)),"A",ЦифрыВнизу);
Иначе
СтрокаШК = СтрокаШК +
ПолучитьКомбинацию(Число(Сред(ШК,4,1)),"B",ЦифрыВнизу);
КонецЕсли;
//09
Если ((Число(Сред(ШК,1,1)) = 0) ИЛИ
(Число(Сред(ШК,1,1)) = 1) ИЛИ
(Число(Сред(ШК,1,1)) = 4) ИЛИ
(Число(Сред(ШК,1,1)) =5) ИЛИ
(Число(Сред(ШК,1,1)) =9)) Тогда
СтрокаШК = СтрокаШК +
ПолучитьКомбинацию(Число(Сред(ШК,5,1)),"A",ЦифрыВнизу);
Иначе
СтрокаШК = СтрокаШК +
ПолучитьКомбинацию(Число(Сред(ШК,5,1)),"B",ЦифрыВнизу);
КонецЕсли;
//08
Если ((Число(Сред(ШК,1,1)) = 0) ИЛИ
(Число(Сред(ШК,1,1)) = 2) ИЛИ
(Число(Сред(ШК,1,1)) = 5) ИЛИ
(Число(Сред(ШК,1,1)) = 6) ИЛИ
(Число(Сред(ШК,1,1)) = 7 )) Тогда
СтрокаШК = СтрокаШК +
ПолучитьКомбинацию(Число(Сред(ШК,6,1)),"A",ЦифрыВнизу);
Иначе
СтрокаШК = СтрокаШК +
ПолучитьКомбинацию(Число(Сред(ШК,6,1)),"B",ЦифрыВнизу);
КонецЕсли;
//07
Если ((Число(Сред(ШК,1,1)) = 0) ИЛИ
(Число(Сред(ШК,1,1)) = 3) ИЛИ
(Число(Сред(ШК,1,1)) = 6) ИЛИ
(Число(Сред(ШК,1,1)) = 8) ИЛИ
(Число(Сред(ШК,1,1)) = 9)) Тогда
СтрокаШК = СтрокаШК +
ПолучитьКомбинацию(Число(Сред(ШК,7,1)),"A",ЦифрыВнизу);
Иначе
СтрокаШК = СтрокаШК +
ПолучитьКомбинацию(Число(Сред(ШК,7,1)),"B",ЦифрыВнизу);
КонецЕсли;
СтрокаШК = СтрокаШК +
"-" +
ПолучитьКомбинацию(Число(Сред(ШК,8,1)),"C",ЦифрыВнизу) + // 08
ПолучитьКомбинацию(Число(Сред(ШК,9,1)),"C",ЦифрыВнизу) + // 09
ПолучитьКомбинацию(Число(Сред(ШК,10,1)),"C",ЦифрыВнизу) + // 10
ПолучитьКомбинацию(Число(Сред(ШК,11,1)),"C",ЦифрыВнизу) + // 11
ПолучитьКомбинацию(Число(Сред(ШК,12,1)),"C",ЦифрыВнизу) + // 12
ПолучитьКомбинацию(Число(Сред(ШК,13,1)),"C",ЦифрыВнизу) + // 13
"!";
Возврат(СтрокаШК);
КонецЕсли;
КонецФункции
// Конец дополнений для ШК
Функция ПолучитьЗначениеТипаШтрихкодаДляЭУ(ТипКода)
Перем Значение;
Если ТипКода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN8 Тогда
Значение = 0;
ИначеЕсли ТипКода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13 Тогда
Значение = 1;
ИначеЕсли ТипКода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN128 Тогда
Значение = 2;
ИначеЕсли ТипКода = ПланыВидовХарактеристик.ТипыШтрихкодов.Code39 Тогда
Значение = 3;
ИначеЕсли ТипКода = ПланыВидовХарактеристик.ТипыШтрихкодов.Code128 Тогда
Значение = 4;
Иначе
Значение = -1;
КонецЕсли;
Возврат Значение;
КонецФункции // ПолучитьЗначениеТипаШтрихкодаДляЭУ()
Процедура КнопкаВыполнитьНажатие(Кнопка)
ШтрихКод="4607098750105";//+12004
Если Проверить_ШтрихКод(ШтрихКод)=Ложь Тогда
//сообщить("Товар: "+Товар+" - Не имеет штрих кода");
ИтШК="";
Иначе
Проверка = Ложь;
Если СтрДлина(ШтрихКод)=8 Тогда
Проверка = Число(ПроверитьКод(ШтрихКод,8));
ИначеЕсли СтрДлина(ШтрихКод)=13 Тогда
Проверка = Число(ПроверитьКод(ШтрихКод,13));
ИначеЕсли (СтрДлина(ШтрихКод) <> 8) и (СтрДлина(ШтрихКод) <> 13) Тогда
Сообщить("Ошибка: код не содержит нужное кол-во символов символов");
//Продолжить;
КонецЕсли;
// Все введено правильно преобразуем
Если Проверка = 11 Тогда
ИтШК = ПреобразованиеШК(ШтрихКод,Истина);
КонецЕсли;
КонецЕсли;
ЭлементыФормы.птд.рисунки.шк.Текст=ИтШК;
КонецПроцедуры
Пока ШтрихКод="4607098750105" все ок, а есть ещё и "460709875010512004"
|
|