Функция ЕстьЗапрещенныеСимволы(Знач СтрокаПроверки) Экспорт СписокРазрешенныхКодов = Новый СписокЗначений; Для а = 48 По 57 Цикл СписокРазрешенныхКодов.Добавить(а); КонецЦикла; СписокРазрешенныхКодов.Добавить(КодСимвола("_")); СписокРазрешенныхКодов.Добавить(КодСимвола("-")); Для а = КодСимвола("А") По КодСимвола("Я") Цикл СписокРазрешенныхКодов.Добавить(а); КонецЦикла; Для а = КодСимвола("а") По КодСимвола("я") Цикл СписокРазрешенныхКодов.Добавить(а); КонецЦикла; СписокРазрешенныхКодов.Добавить(КодСимвола("ё")); СписокРазрешенныхКодов.Добавить(КодСимвола("Ё")); СтрокаПроверки = СокрЛП(СтрокаПроверки); Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда Возврат Истина; Иначе Для а = 1 По СтрДлина(СтрокаПроверки) Цикл Если СписокРазрешенныхКодов.НайтиПоЗначению(КодСимвола(Сред(СтрокаПроверки, а, 1))) = Неопределено Тогда Возврат Истина; КонецЕсли; КонецЦикла; КонецЕсли; Возврат Ложь; КонецФункции Функция ПроверитьПравильностьНомераНакладной(номерДокумента) артТесты.ПроверитьЗаполненность(номерДокумента, "Номер"); ДЛИНА_ПРЕФИКСА_НОМЕРА = 2+1; // Им- первыеДваСимвола = Сред(номерДокумента, 1, ДЛИНА_ПРЕФИКСА_НОМЕРА); Если ЕстьЗапрещенныеСимволы(первыеДваСимвола) Тогда Возврат ЛОЖЬ; КонецЕсли; номерБезНПП = СтрЗаменить(Сред(номерДокумента, ДЛИНА_ПРЕФИКСА_НОМЕРА+1), Символы.НПП, ""); Если ОбщегоНазначения.ЕстьНеЦифры(номерБезНПП) Тогда Возврат ЛОЖЬ; КонецЕсли; Возврат Истина; КонецФункции Функция ПолучитьШтрихкодИзНомераИСуммыРасходнойНакладной(Знач Номер, ИтогоСумма) Экспорт // основано на тестах - Дуэт2009\ЮнитТесты\артРаботаСоШтрихкодамиРасходныхНакладных_Дуэт.epf артТесты.ПроверитьИстину(ПроверитьПравильностьНомераНакладной(Номер), "Данный номер <"+Номер+"> не может использоваться для штрихкодирования. Обратитесь к разработчику"); КОЛИЧЕСТВО_СИМВОЛОВ_ДЛЯ_ДЛИНЫ_КОДА = 2; НомерДок=номер; //Если лев(номер,3)="_00" Тогда // НомерДок=СтрЗаменить(НомерДок,"_00","яя-"); //ИначеЕсли лев(номер,3)="_30" Тогда // НомерДок=СтрЗаменить(НомерДок,"_30","юю-"); //ИначеЕсли лев(номер,3)="-00" Тогда // НомерДок=СтрЗаменить(НомерДок,"-00","ээ-"); //КонецЕсли; Код=""; Для К=1 По СтрДлина(НомерДок) Цикл символ = Сред(НомерДок,К,1); Код=Код+СтрЗаменить(КодСимвола(символ),Символы.НПП,""); КонеЦЦикла; артТесты.ПроверитьЗаполненность(Код, "штрихкод"); длинаКода = СтрДлина(Код); артТесты.ПроверитьМеньше(длинаКода, 100, "длина штрихкода по номеру документа <"+Номер+"> не должна быть больше <КОЛИЧЕСТВО_СИМВОЛОВ_ДЛЯ_ДЛИНЫ_КОДА>"); Код=""+длинаКода+""+Код; Код=Код+(Цел(ИтогоСумма)*10000); Код=СтрЗаменить(Код,Символы.НПП,""); Возврат Код; КонецФункции Функция ПолучитьНомерДокументаИзШтрихкодаРасходнойНакладной(Знач Данные, Сумма) Экспорт // основано на тестах - Дуэт2009\ЮнитТесты\артРаботаСоШтрихкодамиРасходныхНакладных_Дуэт.epf ДЛИНА_ПРЕФИКСА_НОМЕРА = 2; КОЛИЧЕСТВО_СИМВОЛОВ_ДЛЯ_ДЛИНЫ_КОДА = 2; Код=""; количествоВыбираемыхСимволов = 4; // c учетом русских букв Данные = СокрЛП(Данные); Номер=Данные; Длина=Число(Лев(Данные, КОЛИЧЕСТВО_СИМВОЛОВ_ДЛЯ_ДЛИНЫ_КОДА)); начальныйИндекс = КОЛИЧЕСТВО_СИМВОЛОВ_ДЛЯ_ДЛИНЫ_КОДА + 1; первыйСимвол = ""; кодПервогоСимвола = Число(Сред(Номер, начальныйИндекс, 2)); Если кодПервогоСимвола = КодСимвола("_") Тогда первыйСимвол = "_"; ИначеЕсли кодПервогоСимвола = КодСимвола("-") Тогда первыйСимвол = "-"; КонецЕсли; Если первыйСимвол <> "" Тогда количествоВыбираемыхСимволов = 2; // цифры и символы подчеркивания(_) и дефиса(-), без русских букв КонецЕсли; длинаПрефиксаНомера = ДЛИНА_ПРЕФИКСА_НОМЕРА; //П=0; Для К = начальныйИндекс По Длина+2 Цикл ЕЕЕ=Сред(Номер,К,количествоВыбираемыхСимволов); //Если ЕЕЕ="00" Тогда // к=к+количествоВыбираемыхСимволов-1; // п=п+1; // Если п=2 Тогда // количествоВыбираемыхСимволов=2; // Конецесли; // // продолжить; //КонецеСли; Символ=Символ(Сред(Номер,К,количествоВыбираемыхСимволов)); Код=Код+СтрЗаменить(Символ,Символы.НПП,""); к=к+количествоВыбираемыхСимволов-1; длинаПрефиксаНомера = длинаПрефиксаНомера - 1; //п=п+1; Если длинаПрефиксаНомера = 0 Тогда //Если п=2 Тогда количествоВыбираемыхСимволов = 2; // цифры и символы подчеркивания(_) и дефиса(-), без русских букв Конецесли; КонеЦЦикла; Сумма=Число(Сред(Номер,Длина+начальныйИндекс))/10000; // заплатка оставлена на старые коды - в новой схеме этот код уже не используется, но удалять его нельзя код=стрЗаменить(код,"яя-","_00"); код=стрЗаменить(код,"юю-","_30"); код=стрЗаменить(код,"ээ-","-00"); Возврат Код; КонецФункции // // ============= ГЕНЕРАЦИЯ ОБЩЕПРИНЯТОГО ШТРИХКОДА ================== ====================== // // большая часть кода взята из обработки // ПРИМЕР ГЕНЕРАЦИИ ШТРИХКОДА ДЛЯ ДОКУМЕНТОВ, СПРАВОЧНИКОВ И ЕГО РАСШИФРОВКА. // http://infostart.ru/public/62668/ // // ============= ============= ============= ======================== ====================== // Функция ЭтоЧисло(Строка) //Экспорт МассивЧисел = "1234567890"; Длина = СтрДлина(Строка); Знак = ""; Для сим=1 По Длина Цикл Знак = Сред(Строка, сим, 1); Если Найти(МассивЧисел,НРег(Знак)) > 0 Тогда Продолжить; Иначе Возврат Ложь; КонецЕсли; КонецЦикла; Возврат Истина; КонецФункции Функция ЗаменитьСимволы(Стр) //Экспорт Стр1 = СтрЗаменить(Стр, ":", ""); Стр1 = СтрЗаменить(Стр, ".", ""); Пока Найти(Стр1, " ") > 0 Цикл Стр1 = СтрЗаменить(Стр1, " ", ""); КонецЦикла; Стр1 = СтрЗаменить(Стр1, "а", "f"); Стр1 = СтрЗаменить(Стр1, "б", "$f"); Стр1 = СтрЗаменить(Стр1, "в", "d"); Стр1 = СтрЗаменить(Стр1, "г", "u"); Стр1 = СтрЗаменить(Стр1, "д", "l"); Стр1 = СтрЗаменить(Стр1, "е", "t"); Стр1 = СтрЗаменить(Стр1, "ё", "$t"); Стр1 = СтрЗаменить(Стр1, "ж", "$p"); Стр1 = СтрЗаменить(Стр1, "з", "p"); Стр1 = СтрЗаменить(Стр1, "и", "b"); Стр1 = СтрЗаменить(Стр1, "к", "r"); Стр1 = СтрЗаменить(Стр1, "л", "k"); Стр1 = СтрЗаменить(Стр1, "м", "v"); Стр1 = СтрЗаменить(Стр1, "н", "y"); Стр1 = СтрЗаменить(Стр1, "о", "j"); Стр1 = СтрЗаменить(Стр1, "п", "g"); Стр1 = СтрЗаменить(Стр1, "р", "h"); Стр1 = СтрЗаменить(Стр1, "с", "c"); Стр1 = СтрЗаменить(Стр1, "т", "n"); Стр1 = СтрЗаменить(Стр1, "у", "e"); Стр1 = СтрЗаменить(Стр1, "ф", "a"); Стр1 = СтрЗаменить(Стр1, "х", "$w"); Стр1 = СтрЗаменить(Стр1, "ц", "w"); Стр1 = СтрЗаменить(Стр1, "ч", "x"); Стр1 = СтрЗаменить(Стр1, "ш", "i"); Стр1 = СтрЗаменить(Стр1, "щ", "o"); Стр1 = СтрЗаменить(Стр1, "ь", "m"); Стр1 = СтрЗаменить(Стр1, "ъ", "$m"); Стр1 = СтрЗаменить(Стр1, "ы", "s"); Стр1 = СтрЗаменить(Стр1, "э", "$a"); Стр1 = СтрЗаменить(Стр1, "ю", "$y"); Стр1 = СтрЗаменить(Стр1, "я", "z"); Стр1 = СтрЗаменить(Стр1, "й", "q"); Стр1 = СтрЗаменить(Стр1, "А", "F"); Стр1 = СтрЗаменить(Стр1, "Б", "$F"); Стр1 = СтрЗаменить(Стр1, "В", "D"); Стр1 = СтрЗаменить(Стр1, "Г", "U"); Стр1 = СтрЗаменить(Стр1, "Д", "L"); Стр1 = СтрЗаменить(Стр1, "Е", "T"); Стр1 = СтрЗаменить(Стр1, "Ё", "$T"); Стр1 = СтрЗаменить(Стр1, "Ж", "$P"); Стр1 = СтрЗаменить(Стр1, "З", "P"); Стр1 = СтрЗаменить(Стр1, "И", "B"); Стр1 = СтрЗаменить(Стр1, "К", "R"); Стр1 = СтрЗаменить(Стр1, "Л", "K"); Стр1 = СтрЗаменить(Стр1, "М", "V"); Стр1 = СтрЗаменить(Стр1, "Н", "Y"); Стр1 = СтрЗаменить(Стр1, "О", "J"); Стр1 = СтрЗаменить(Стр1, "П", "G"); Стр1 = СтрЗаменить(Стр1, "Р", "H"); Стр1 = СтрЗаменить(Стр1, "С", "C"); Стр1 = СтрЗаменить(Стр1, "Т", "N"); Стр1 = СтрЗаменить(Стр1, "У", "E"); Стр1 = СтрЗаменить(Стр1, "Ф", "A"); Стр1 = СтрЗаменить(Стр1, "Х", "$W"); Стр1 = СтрЗаменить(Стр1, "Ц", "W"); Стр1 = СтрЗаменить(Стр1, "Ч", "X"); Стр1 = СтрЗаменить(Стр1, "Ш", "I"); Стр1 = СтрЗаменить(Стр1, "Щ", "O"); Стр1 = СтрЗаменить(Стр1, "Ь", "M"); Стр1 = СтрЗаменить(Стр1, "Ъ", "$M"); Стр1 = СтрЗаменить(Стр1, "Ы", "S"); Стр1 = СтрЗаменить(Стр1, "Э", "$A"); Стр1 = СтрЗаменить(Стр1, "Ю", "$Y"); Стр1 = СтрЗаменить(Стр1, "Я", "Z"); Стр1 = СтрЗаменить(Стр1, "Й", "Q"); Возврат Стр1; КонецФункции // ЗаменитьСимволы() Функция ЗаменитьСимволыАнг(Стр) //Экспорт Стр1=""; ДлСтр = СтрДлина(Стр); Для м=1 По ДлСтр Цикл пСмв = Сред(Стр,м,1); Если ЭтоЧисло(пСмв) Тогда //ничего не заменяем ИначеЕсли пСмв <> "$" Тогда пСмв = СтрЗаменить(пСмв, "f", "а"); пСмв = СтрЗаменить(пСмв, "d", "в"); пСмв = СтрЗаменить(пСмв, "u", "г"); пСмв = СтрЗаменить(пСмв, "l", "д"); пСмв = СтрЗаменить(пСмв, "t", "е"); пСмв = СтрЗаменить(пСмв, "p", "з"); пСмв = СтрЗаменить(пСмв, "b", "и"); пСмв = СтрЗаменить(пСмв, "r", "к"); пСмв = СтрЗаменить(пСмв, "k", "л"); пСмв = СтрЗаменить(пСмв, "v", "м"); пСмв = СтрЗаменить(пСмв, "y", "н"); пСмв = СтрЗаменить(пСмв, "j", "о"); пСмв = СтрЗаменить(пСмв, "g", "п"); пСмв = СтрЗаменить(пСмв, "h", "р"); пСмв = СтрЗаменить(пСмв, "c", "с"); пСмв = СтрЗаменить(пСмв, "n", "т"); пСмв = СтрЗаменить(пСмв, "e", "у"); пСмв = СтрЗаменить(пСмв, "a", "ф"); пСмв = СтрЗаменить(пСмв, "w", "ц"); пСмв = СтрЗаменить(пСмв, "x", "ч"); пСмв = СтрЗаменить(пСмв, "i", "ш"); пСмв = СтрЗаменить(пСмв, "o", "щ"); пСмв = СтрЗаменить(пСмв, "m", "ь"); пСмв = СтрЗаменить(пСмв, "s", "ы"); пСмв = СтрЗаменить(пСмв, "z", "я"); пСмв = СтрЗаменить(пСмв, "q", "й"); пСмв = СтрЗаменить(пСмв, "F", "А"); пСмв = СтрЗаменить(пСмв, "D", "В"); пСмв = СтрЗаменить(пСмв, "U", "Г"); пСмв = СтрЗаменить(пСмв, "L", "Д"); пСмв = СтрЗаменить(пСмв, "T", "Е"); пСмв = СтрЗаменить(пСмв, "P", "З"); пСмв = СтрЗаменить(пСмв, "B", "И"); пСмв = СтрЗаменить(пСмв, "R", "К"); пСмв = СтрЗаменить(пСмв, "K", "Л"); пСмв = СтрЗаменить(пСмв, "V", "М"); пСмв = СтрЗаменить(пСмв, "Y", "Н"); пСмв = СтрЗаменить(пСмв, "J", "О"); пСмв = СтрЗаменить(пСмв, "G", "П"); пСмв = СтрЗаменить(пСмв, "H", "Р"); пСмв = СтрЗаменить(пСмв, "C", "С"); пСмв = СтрЗаменить(пСмв, "N", "Т"); пСмв = СтрЗаменить(пСмв, "E", "У"); пСмв = СтрЗаменить(пСмв, "A", "Ф"); пСмв = СтрЗаменить(пСмв, "W", "Ц"); пСмв = СтрЗаменить(пСмв, "X", "Ч"); пСмв = СтрЗаменить(пСмв, "I", "Ш"); пСмв = СтрЗаменить(пСмв, "O", "Щ"); пСмв = СтрЗаменить(пСмв, "M", "Ь"); пСмв = СтрЗаменить(пСмв, "S", "Ы"); пСмв = СтрЗаменить(пСмв, "Z", "Я"); пСмв = СтрЗаменить(пСмв, "Q", "Й"); Иначе пСмв = Сред(Стр,м,2); м = м+1; пСмв = СтрЗаменить(пСмв, "$t", "ё"); пСмв = СтрЗаменить(пСмв, "$p", "ж"); пСмв = СтрЗаменить(пСмв, "$f", "б"); пСмв = СтрЗаменить(пСмв, "$w", "х"); пСмв = СтрЗаменить(пСмв, "$m", "ъ"); пСмв = СтрЗаменить(пСмв, "$a", "э"); пСмв = СтрЗаменить(пСмв, "$y", "ю"); пСмв = СтрЗаменить(пСмв, "$F", "Б"); пСмв = СтрЗаменить(пСмв, "$T", "Ё"); пСмв = СтрЗаменить(пСмв, "$P", "Ж"); пСмв = СтрЗаменить(пСмв, "$W", "Х"); пСмв = СтрЗаменить(пСмв, "$M", "Ъ"); пСмв = СтрЗаменить(пСмв, "$A", "Э"); пСмв = СтрЗаменить(пСмв, "$Y", "Ю"); КонецЕсли; Стр1 = Стр1 + пСмв; КонецЦикла; Возврат Стр1; КонецФункции // ЗаменитьСимволы() Функция ТипСимволов(СимволКод) //Экспорт Если СимволКод < 32 Тогда Возврат(1); //Команда ИначеЕсли (48 <= СимволКод) и (СимволКод<=57) Тогда Возврат(3); //Цифра Иначе Возврат(2); //Буква, знак КонецЕсли; КонецФункции Функция Мод(Ч,З) //Экспорт Возврат(Ч-Цел(Ч/З)*З); КонецФункции Функция НайтиИП(Стр, КоррFNC) //Экспорт Если Найти(Стр,"(00)")>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(01)")>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(02)")>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(10)")>0 Или Найти(Стр,"(21)")>0 Тогда КоррFNC = 20; Возврат Истина; ИначеЕсли Найти(Стр,"(11)")>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(13)")>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(15)")>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(17)")>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(20)")>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(23"+Сред(Стр,4,2))>0 Тогда КоррFNC = Число(Сред(Стр,4,1)); Возврат Истина; ИначеЕсли Найти(Стр,"(37)") Тогда КоррFNC = 8; Возврат Истина; ИначеЕсли Найти(Стр,"(240)")>0 Или Найти(Стр,"(250)")>0 Тогда КоррFNC = 30; Возврат Истина; ИначеЕсли Найти(Стр,"(310"+Прав(СтрДлина(Стр),2))>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(311"+Прав(СтрДлина(Стр),2))>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(312"+Прав(СтрДлина(Стр),2))>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(313"+Прав(СтрДлина(Стр),2))>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(314"+Прав(СтрДлина(Стр),2))>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(315"+Прав(СтрДлина(Стр),2))>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(316"+Прав(СтрДлина(Стр),2))>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(330"+Прав(СтрДлина(Стр),2))>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(331"+Прав(СтрДлина(Стр),2))>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(332"+Прав(СтрДлина(Стр),2))>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(333"+Прав(СтрДлина(Стр),2))>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(334"+Прав(СтрДлина(Стр),2))>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(335"+Прав(СтрДлина(Стр),2))>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(336"+Прав(СтрДлина(Стр),2))>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(37)")>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(400)")>0 Тогда КоррFNC = 29; Возврат Истина; ИначеЕсли Найти(Стр,"(410)")>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(411)")>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(412)")>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(420)")>0 Тогда КоррFNC = 12; Возврат Истина; ИначеЕсли Найти(Стр,"(8005)")>0 Тогда Возврат Истина; ИначеЕсли Найти(Стр,"(91)")>0 Или Найти(Стр,"(92)")>0 Или Найти(Стр,"(93)")>0 Или Найти(Стр,"(94)")>0 Или Найти(Стр,"(95)")>0 Или Найти(Стр,"(96)")>0 Или Найти(Стр,"(97)")>0 Или Найти(Стр,"(98)")>0 Или Найти(Стр,"(99)")>0 Тогда КоррFNC = 30; Возврат Истина; Иначе КоррFNC = 0; Возврат Ложь; КонецЕсли; Возврат Ложь; КонецФункции Функция КонтролСумма(СтрокаКода) Проверка = Истина; УбратьЗн = 1; Пока Проверка Цикл Ном = 0; Сум = 0; Код = Лев(СтрокаКода,3); Если Код = "104" Тогда Кодировка = 2; ИначеЕсли Код = "105" Тогда Кодировка = 3; Иначе Кодировка = 1; КонецЕсли; Если Ном > 0 Тогда Сум = Мод(Сум+Код*Ном,103); Иначе Сум = Мод(Код,103); КонецЕсли; Ном = Ном+1; Сумма = Прав(СтрокаКода,УбратьЗн); Код = Сред(СтрокаКода,4); ДлКода = СтрДлина(Код)-УбратьЗн; Код = Лев(Код,ДлКода); Модуль = 6; МЧисл=0; // Артур Для Сч = 1 По ДлКода Цикл Если Кодировка = 2 Или Кодировка = 1 Тогда СимвКод = Сред(Код,Сч,2); Если СимвКод = "10" Тогда // смотрим следующий знак Знак = Сред(Код,Сч+2,1); Если Знак = "1" Тогда Кодировка = 1; Строка = Число(Сред(Код,Сч,3)); Сум = Мод(Сум+Строка*Ном,103); Ном = Ном+1; Сч = Сч+3; Если Сч < ДлКода Тогда Строка = Число(Сред(Код,Сч,2)); Сум = Мод(Сум+Строка*Ном,103); Ном = Ном+1; Сч = Сч+1; Иначе Сч = ДлКода; КонецЕсли; Продолжить; КонецЕсли; ИначеЕсли СимвКод = "99" Тогда Кодировка = 3; Сум = Мод(Сум+Число(СимвКод)*Ном,103); Ном = Ном+1; Сч=Сч+2; Если Сч < ДлКода Тогда СимвКод = Сред(Код,Сч,1); Сум = Мод(Сум+Число(СимвКод)*Ном,103); Ном = Ном +1; МЧисл=0; МЧисл = ?(ДлКода-(Модуль-1)> Сч, Модуль-1,0); МЧисл = МЧисл-1; Иначе Сч = ДлКода; КонецЕсли; Продолжить; Иначе Сум = Мод(Сум+Число(СимвКод)*Ном,103); Ном = Ном+1; Сч = Сч+1; Продолжить; КонецЕсли; Сум = Мод(Сум+Число(СимвКод)*Ном,103); Ном = Ном+1; Сч = Сч+1; КонецЕсли; Если Кодировка = 3 Тогда СимвКод = Сред(Код,Сч,1); Если СимвКод = "1" И МЧисл <= 0 Тогда // проверим следущие 2 знака Знак = Сред(Код,Сч+1,2); Если Знак = "01" Тогда Кодировка = 1; Строка = Число(Сред(Код,Сч,3)); Сум = Мод(Сум+Строка*Ном,103); Ном = Ном+1; Сч=Сч+3; Если Сч < ДлКода Тогда СимвКод = Сред(Код,Сч,2); Сум = Мод(Сум+Число(СимвКод)*Ном,103); Ном = Ном+1; Сч = Сч+1; Иначе Сч = ДлКода; КонецЕсли; ИначеЕсли Знак = "00" Тогда Кодировка = 2; Строка = Число(Сред(Код,Сч,3)); Сум = Мод(Сум+Строка*Ном,103); Ном = Ном+1; Сч=Сч+3; Если Сч < ДлКода Тогда СимвКод = Сред(Код,Сч,2); Сум = Мод(Сум+Число(СимвКод)*Ном,103); Ном = Ном+1; Сч = Сч+1; Иначе Сч = ДлКода; КонецЕсли; Иначе Сум = Мод(Сум+Число(СимвКод)*Ном,103); Ном = Ном+1; МЧисл=МЧисл-1; КонецЕсли; Иначе Сум = Мод(Сум+Число(СимвКод)*Ном,103); Ном = Ном+1; МЧисл = МЧисл-1; КонецЕсли; КонецЕсли; КонецЦикла; Если Сум = Число(Сумма) Тогда Проверка = Ложь; Иначе УбратьЗн = УбратьЗн + 1; КонецЕсли; КонецЦикла; Возврат УбратьЗн; КонецФункции Функция Code128(знач КодСтрока, перекодироватьСимволыВЛатиницу, БазаМодеС=6) Экспорт Если перекодироватьСимволыВЛатиницу Тогда Если Найти(КодСтрока,"^") Тогда Сообщить("В исходной строке есть символ ^ "+Символы.ПС+"При использовании перекодировки в латиницу этот служебный символ запрещено использовать!"); Возврат ""; КонецЕсли; КодСтрока = СтрЗаменить(КодСтрока," ", "^"); КодСтрока = ЗаменитьСимволы(КодСтрока); //КодСтрока = СтрЗаменить(КодСтрока,"^"," "); КонецЕсли; //Фильтр пустого входа кодируемых данных Если КодСтрока = "" Тогда Возврат(""); КонецЕсли; ВыхТ = Новый ТаблицаЗначений; ВыхТ.Колонки.Добавить("А",,"Аск",4); //Аски код //Очищаем выход ВыхТ.Очистить(); Дл = СтрДлина(СокрЛП(КодСтрока)); //Разборки со стартовым кодом //Принимаем решение о смене подсистемы кодирования "моде" (А-1, В-2, С-3) //Анализируем тип двух первых символов ТекСимв = КодСимвола(Сред(КодСтрока,1,1)); ТипТекСимв = ТипСимволов(ТекСимв); Если Дл > 1 Тогда СлСимв = КодСимвола(Сред(КодСтрока,2,1)); ТипСлСимв = ТипСимволов(СлСимв); Иначе ТипСлСимв = 2; КонецЕсли; Моде = ТипТекСимв; Если (ТипТекСимв = 3) И (ТипСлСимв = 3) Тогда Моде = 3; КонецЕсли; //В выходную таблицу добавляем символ старта подсистемы НоваяСтрока = ВыхТ.Добавить(); НоваяСтрока.А = 102 + Моде; //Вых = 102 + Моде; //Анализируем входные символы Для Сч = 1 по Дл Цикл ТекСимв = КодСимвола(Сред(КодСтрока,Сч,1)); Если ТекСимв > 127 Тогда Сообщить("Символ № "+Сч+ " со значением="+ ТекСимв+" не разрешен в штрихкоде"); Возврат ""; //Продолжить; КонецЕсли; ТипТекСимв = ТипСимволов(ТекСимв); //Принимаем решение о смене подсистемы кодирования (моде). Если ТипТекСимв <> Моде Тогда Если ТипТекСимв < 3 Тогда //Нужно менять моде либо с А на В, либо с В на А НоваяСтрока = ВыхТ.Добавить(); Если Моде = 1 Тогда НоваяСтрока.А = 100; //Переключаемся из А в В ИначеЕсли Моде = 2 Тогда НоваяСтрока.А = 101; //Переключаемся из В в А Иначе НоваяСтрока.А = 100; //Переключаемся из С в В КонецЕсли; Моде = ТипТекСимв; Иначе //Находимся в моде А или В, встретили цифру. //Прикидываем, стоит ли переключаться в МодеС //Смотрим на БазаМодеС знаков вперед. //Оптимально, БазаМодеС = 6 ДлМ = ?(Дл < Сч+БазаМодеС-1, Дл, Сч+БазаМодеС-1); СчЦ = 0; Для СчМ = Сч по ДлМ Цикл МодМ = ТипСимволов(КодСимвола(Сред(КодСтрока,СчМ,1))); //Если цифра - смотрим дальше Если МодМ = 3 Тогда СчЦ = СчЦ+1; Продолжить; Иначе СчЦ = 0; Прервать; КонецЕсли; КонецЦикла; //Если нужно переключится в С Если СчЦ - БазаМодеС = 0 Тогда Моде = 3; НоваяСтрока = ВыхТ.Добавить(); НоваяСтрока.А = 99; //Переключаемся из А или В в С КонецЕсли; КонецЕсли; КонецЕсли; //Добавляем очередной символ //Если символ в МодеС Если Моде = 3 Тогда СлСимв = КодСимвола(Сред(КодСтрока,Сч+1,1)); ТипСлСимв = ТипСимволов(СлСимв); //Если кодируемая строка кончается на первой цифре, или //конец кодируемой строки цифра+не цифра Если (Сч = Дл) или (ТипТекСимв <> 3) Или (ТипСлСимв <> 3) Тогда //Переключаемся из режима С в режим В Моде = 2; НоваяСтрока = ВыхТ.Добавить(); НоваяСтрока.А = 100; Иначе //Добавляем символ в МодеС Если (ТипТекСимв <> 3) Или (ТипСлСимв <> 3) тогда Сообщить("Ошибка"+ Сч+" "+ ТекСимв+" "+СлСимв); Иначе НоваяСтрока = ВыхТ.Добавить(); НоваяСтрока.А = Число(Символ(ТекСимв)); //+Символ(СлСимв)); //Сч = Сч+1; Продолжить; КонецЕсли; КонецЕсли; КонецЕсли; //Добавляем символ в МодеА, или МодеВ НоваяСтрока = ВыхТ.Добавить(); Если Моде = 1 тогда НоваяСтрока.А = ТекСимв+64; Иначе Если СтрДлина(Строка(ТекСимв-32))= 1 Тогда НоваяСтрока.А = "0" + Строка(ТекСимв-32); Иначе НоваяСтрока.А = ТекСимв-32; КонецЕсли; КонецЕсли; КонецЦикла; //Считаем контрольную сумму и формируем баркод //ВыхТ.ВыбратьСтроки(); Сум = 0; Ном = 0; Для каждого Строка Из ВыхТ Цикл Если Ном > 0 Тогда Сум = Мод(Сум+Строка.А*Ном,103); Вых = Вых+ Строка.А; Иначе Сум = Мод(Строка.А,103); Вых = Строка(Строка.А); КонецЕсли; Ном = Ном+1; КонецЦикла; Возврат(Вых + Сум);// + Символ(106)); КонецФункции Функция EAN8(знач КодСтрока) Экспорт КоррДан = ""; EAN2Доб = ""; EAN5Доб = ""; // проверим, что только цифры ДлСтр = СтрДлина(КодСтрока); Для п=1 По ДлСтр Цикл ТекСмв = КодСимвола(Сред(КодСтрока,п,1)); Если ТекСмв > 47 И ТекСмв < 58 Тогда КоррДан = КоррДан + Сред(КодСтрока,п,1); КонецЕсли; КонецЦикла; // проверяем дополнения к ШК ДлСтр = СтрДлина(КоррДан); Если ДлСтр < 7 Тогда КоррДан = "0000000"; ИначеЕсли ДлСтр = 11 Тогда КоррДан = "0000000"; ИначеЕсли ДлСтр = 8 Тогда КоррДан = Сред(КоррДан,1,7); ИначеЕсли ДлСтр = 10 Тогда КоррДан = Сред(КоррДан,1,7)+Сред(КоррДан,9,2); ИначеЕсли ДлСтр > 12 Тогда КоррДан = Сред(КоррДан,1,7)+Сред(КоррДан,9,5); Иначе // у нас нет дополнения ШК КонецЕсли; ДлСтр = СтрДлина(КоррДан); Если ДлСтр = 9 Тогда EAN2Доб = Сред(КоррДан,8,2); ИначеЕсли ДлСтр = 12 Тогда EAN5Доб = Сред(КоррДан,8,5); Иначе EAN5Доб = ""; EAN2Доб = ""; КонецЕсли; КодСтрока = Сред(КоррДан,1,7); //расчитываем контрольную сумму Коэф = 3; ВзвСум = 0; п = СтрДлина(КодСтрока); Пока п >= 1 Цикл ТекЧисСмв = Число(Сред(КодСтрока,п,1)); ВзвСум = ВзвСум + ТекЧисСмв*Коэф; Коэф = 4-Коэф; п=п-1; КонецЦикла; Сум = ВзвСум%10; Если Сум <> 0 Тогда КонтрСум = (10-Сум); Иначе КонтрСум = 0; КонецЕсли; КодСтрока = КодСтрока+КонтрСум; //Если СтрДлина(EAN2Доб) = 2 Тогда // КодСтрока = КодСтрока + " " + ПроцессEAN2Добавления(EAN2Доб); //ИначеЕсли СтрДлина(EAN5Доб) = 5 Тогда // КодСтрока = КодСтрока + " " + ПроцессEAN5Добавления(EAN5Доб); //Иначе // // код без добавочных данных //КонецЕсли; Возврат КодСтрока; КонецФункции Функция EAN13(знач КодСтрока) Экспорт ПечДанные = ""; КоррДанные = ""; КодСтрока = ЗаменитьСимволы(КодСтрока); ДлинаСтроки = СтрДлина(КодСтрока); Для п =1 По ДлинаСтроки Цикл НомСимвола = КодСимвола(Сред(КодСтрока,п,1)); Если НомСимвола > 47 И НомСимвола < 58 Тогда КоррДанные = КоррДанные + Сред(КодСтрока,п,1); Иначе КоррДанные = КоррДанные + (НомСимвола-32); КонецЕсли; КонецЦикла; ДлинаСтроки = СтрДлина(КоррДанные); Если ДлинаСтроки < 12 Тогда КоррДанные = КоррДанные + Лев("0000000000000",12-ДлинаСтроки); ИначеЕсли ДлинаСтроки > 14 Тогда КоррДанные = Лев(КоррДанные, 12) ; ИначеЕсли ДлинаСтроки = 13 Тогда КоррДанные = Сред(КоррДанные, 1, 12); КонецЕсли; // КодСтрока = Сред(КоррДанные, 1, 12); // с использованием переменного паритета между наборами символов A и B ВедущаяЦифра = Число(Сред(КодСтрока, 1, 1)); Если ВедущаяЦифра = 0 Тогда Кодирование = "AAAAAACCCCCC"; ИначеЕсли ВедущаяЦифра = 1 Тогда Кодирование = "AABABBCCCCCC"; ИначеЕсли ВедущаяЦифра = 2 Тогда Кодирование = "AABBABCCCCCC"; ИначеЕсли ВедущаяЦифра = 3 Тогда Кодирование = "AABBBACCCCCC"; ИначеЕсли ВедущаяЦифра = 4 Тогда Кодирование = "ABAABBCCCCCC"; ИначеЕсли ВедущаяЦифра = 5 Тогда Кодирование = "ABBAABCCCCCC"; ИначеЕсли ВедущаяЦифра = 6 Тогда Кодирование = "ABBBAACCCCCC"; ИначеЕсли ВедущаяЦифра = 7 Тогда Кодирование = "ABABABCCCCCC"; ИначеЕсли ВедущаяЦифра = 8 Тогда Кодирование = "ABABBACCCCCC"; Иначе Кодирование = "ABBABACCCCCC"; КонецЕсли; // определим символ для печати правильного штрих-кода ДлинаСтроки = СтрДлина(КодСтрока); Для м = 1 По ДлинаСтроки Цикл // получим значение ASCII каждого символа, кроме первого КоррНомСимвола = КодСимвола(Сред(КодСтрока, м, 1)); КоррКодирование = Сред(Кодирование, м, 1); // печатаем разные штрих-коды согласно положения КоррНомСимвола и КоррКодирование Если КоррКодирование = "A" или КоррКодирование = "B" Тогда ПечДанные = ПечДанные + Символ(КоррНомСимвола); ИначеЕсли КоррКодирование = "C" Тогда ПечДанные = ПечДанные + Прав(КоррНомСимвола - 32,1); КонецЕсли; //// КонецЦикла; Коэффициент = 3; ВзвСумма = 0; м = СтрДлина(ПечДанные); Пока м >= 1 Цикл // получим значение каждого номера с конца КоррНомСимвола = Число(Сред(ПечДанные,м,1)); // умножаем на взвешенный коэффициент равный 3,1,3,1... // и добавим в строку ВзвСумма = ВзвСумма + КоррНомСимвола * Коэффициент; // коэффициент изменения для следующего вычисления Коэффициент = 4 - Коэффициент; м = м-1; КонецЦикла; // найдем проверочную цифру найденного номера + ВзвСумма которрая = кратному 10 // делим на 10, из полученного результата отнимем 10 м = (ВзвСумма % 10); Если м <> 0 Тогда ПровЦифра = (10 - м); Иначе ПровЦифра = 0; КонецЕсли; // добавим проверочную цифру в конец штрих-кода ПечДанные = ПечДанные + ПровЦифра; // закодируем ведущую цифру в левую половину символа EAN-13 // процесс дополнений, если они существуют //Если СтрДлина(EAN2Добавить) = 2 Тогда // ПечДанные = ПечДанные + " " + ПроцессEAN2Добавить(EAN2Добавить); //КонецЕсли; // //Если СтрДлина(EAN5Добавить) = 5 Тогда // ПечДанные = ПечДанные + " " + ПроцессEAN5Добавить(EAN5Добавить); //КонецЕсли; Возврат ПечДанные; КонецФункции Функция EAN128(знач КодСтрока) Экспорт пКод = ""; НачИП = 1; КонИП = 1; ДлинаСтроки = СтрДлина(КодСтрока); КоррFNC = 0; Для м = 1 По ДлинаСтроки Цикл // получим значение ASCII КоррНомСимвола = КодСимвола(Сред(КодСтрока,м,1)); Если КоррНомСимвола > 32 И КоррНомСимвола < 48 Тогда Если КоррНомСимвола >= 40 И КоррНомСимвола <= 41 Тогда Если КоррFNC <> 0 Тогда ПровFNC = СтрДлина(Сред(пКод,КонИП,м-КонИП)); Если ПровFNC < КоррFNC Тогда // заполняем нулями Пока ПровFNC < КоррFNC Цикл пКод = пКод + "0"; ПровFNC = ПровFNC +1; КонецЦикла; КоррFNC = 0; КонецЕсли; КонецЕсли; пКод = пКод + Символ(КоррНомСимвола); Если КоррНомСимвола = 40 Тогда НачИП = СтрДлина(пКод); Иначе КонИП = СтрДлина(пКод); КонецЕсли; Иначе пКод = пКод + Символ(КоррНомСимвола); КонецЕсли; ИначеЕсли КоррНомСимвола >= 48 И КоррНомСимвола < 127 Тогда // кодировка Если (НайтиИП(Сред(пКод,НачИП,КонИП),КоррFNC)) И КоррFNC = 0 И (ТипСимволов(КоррНомСимвола)=2) Тогда пКод = пКод + Строка(КоррНомСимвола-32); Иначе пКод = пКод + Символ(КоррНомСимвола); КонецЕсли; Иначе Возврат пКод = ""; КонецЕсли; КонецЦикла; Возврат пКод; КонецФункции Функция Code39(знач КодСтрока) Экспорт Code39 = ""; КодСтрока = СтрЗаменить(СтрЗаменить(ЗаменитьСимволы(ВРег(СтрЗаменить(КодСтрока," ", "^"))),"^"," "),",","."); ДлКода = СтрДлина(КодСтрока); Если ДлКода <> 0 Тогда Для п=1 По ДлКода Цикл КодСимв = КодСимвола(Сред(КодСтрока,п,1)); Если НЕ (КодСимв = 32 Или КодСимв = 36 Или КодСимв = 37 Или КодСимв = 43 Или КодСимв = 45 Или КодСимв = 47 Или КодСимв = 46 Или (КодСимв >= 48 И КодСимв <= 57) Или (КодСимв >= 65 И КодСимв <= 90)) Тогда п=0; Прервать; КонецЕсли; КонецЦикла; Если п > 0 Тогда Code39 = КодСтрока; КонецЕсли; КонецЕсли; Возврат Code39; КонецФункции Функция РаскодироватьШтрихкод(штрихкод, перекодироватьСимволыВЛатиницу, результатВыполнения, типШтрихКода = Неопределено) Экспорт результатВыполнения = ""; //Ошибка=Ложь; Если НЕ ЗначениеЗаполнено(ТипШтрихкода) Тогда Условие = СтрДлина(ШтрихКод) - 1; Для Индекс = 0 По Условие Цикл Если КодСимвола(ШтрихКод, Индекс) > 127 Тогда результатВыполнения = "Неверные символы в штрихкоде - код символа больше 127"; Возврат ""; //Ошибка = Истина; КонецЕсли; КонецЦикла; КонецЕсли; РасшСтрока = ""; ШК = штрихкод; //ЭлементыФормы.ШтрихКод.Значение; ДанДок = СтрЗаменить(ШК,"f",""); // проверяем кодировку или точный типШК ПровШК = Лев(ДанДок,3); Если ПровШК = "103" Или ПровШК = "104" Или ПровШК = "105" Тогда ТипШК = ПланыВидовХарактеристик.ТипыШтрихкодов.Code128; ИначеЕсли Найти(ДанДок,"(")>0 И Найти(ДанДок,")")>0 Тогда ТипШК = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN128; ИначеЕсли Найти(ДанДок,Символ(32)) Тогда ТипШК = ПланыВидовХарактеристик.ТипыШтрихкодов.Code39; ИначеЕсли СтрДлина(ДанДок) = 8 Тогда ТипШК = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN8; ИначеЕсли СтрДлина(ДанДок) = 13 Тогда ТипШК = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13; Иначе ТипШК = Неопределено; результатВыполнения = "Не удалось определить тип штрихкода."; Возврат ""; //Ошибка = Истина; КонецЕсли; Если НЕ РаботаСТорговымОборудованием.ПроверитьШтрихКод(ШК, ТипШК)Тогда результатВыполнения = "Неверный штрихкод - РаботаСТорговымОборудованием.ПроверитьШтрихКод."; Возврат ""; КонецЕсли; Если ТипШК = ПланыВидовХарактеристик.ТипыШтрихкодов.Code128 Тогда ТекКод = Лев(ДанДок,3); Если ТекКод = "104" Тогда Кодировка = 2; ИначеЕсли ТекКод = "105" Тогда Кодировка = 3; Иначе Кодировка = 1; КонецЕсли; ТекКод = Сред(ДанДок,4); ДлТекКода = СтрДлина(ТекКод) - КонтролСумма(ДанДок); Модуль = 6; МЧисл=0; Для Сч = 1 По ДлТекКода Цикл Если Кодировка = 2 Или Кодировка = 1 Тогда СимвКод = Сред(ТекКод,Сч,2); Если СимвКод = "10" Тогда // смотрим следующий знак Знак = Сред(ТекКод,Сч+2,1); Если Знак = "1" Тогда Кодировка = 1; Сч = Сч+3; Если Сч < ДлТекКода Тогда РасшСтрока = РасшСтрока + Символ(Число(Сред(ТекКод,Сч,2))-64); Сч = Сч+1; Иначе Сч = ДлТекКода; КонецЕсли; Продолжить; КонецЕсли; ИначеЕсли СимвКод = "99" Тогда Кодировка = 3; Сч=Сч+2; СимвКод = Сред(ТекКод,Сч,1); РасшСтрока = РасшСтрока + СимвКод; МЧисл = ?(ДлТекКода-(Модуль-1)> Сч, Модуль-1,0); МЧисл = МЧисл-1; Продолжить; Иначе //Если ДлТекКода-Сч <= 2 Тогда // Сч=ДлТекКода; //Иначе РасшСтрока = РасшСтрока + Символ(Число(СимвКод)+32); Сч = Сч+1; //КонецЕсли; Продолжить; КонецЕсли; РасшСтрока = РасшСтрока + Символ(Число(СимвКод)+32); Сч = Сч+1; КонецЕсли; Если Кодировка = 3 Тогда СимвКод = Сред(ТекКод,Сч,1); Если СимвКод = "1" И МЧисл <= 0 Тогда // проверим следущие 2 знака Знак = Сред(ТекКод,Сч+1,2); Если Знак = "01" Тогда Кодировка = 1; Сч=Сч+3; СимвКод = Сред(ТекКод,Сч,2); РасшСтрока = РасшСтрока + Символ(Число(СимвКод)-64); Сч = Сч+1; ИначеЕсли Знак = "00" Тогда Кодировка = 2; Сч=Сч+3; СимвКод = Сред(ТекКод,Сч,2); РасшСтрока = РасшСтрока + Символ(Число(СимвКод)+32); Сч = Сч+1; Иначе РасшСтрока = РасшСтрока + СимвКод; МЧисл=МЧисл-1; КонецЕсли; Иначе РасшСтрока = РасшСтрока + СимвКод; МЧисл = МЧисл-1; КонецЕсли; КонецЕсли; КонецЦикла; ИначеЕсли ТипШК = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN128 Тогда ДлТекКода = СтрДлина(ДанДок); СтрКода = ""; КоррFNC = 0; Для Сч =1 По ДлТекКода Цикл ЗнКода = Сред(ДанДок,Сч,1); Если ЗнКода = "(" И Сч=1 Тогда НачКодировки = 1; КонКодировки = 0; НачИП = Сч; ИначеЕсли ЗнКода = "(" Тогда НачКодировки = 1; КонКодировки = 0; СтрКода = СтрКода + "^"; НачИП = Сч; ИначеЕсли ЗнКода = ")" Тогда КонКодировки = 1; КонИП = Сч+1-НачИП; Продолжить; Иначе КонецЕсли; Если КонКодировки = 0 Тогда Продолжить; КонецЕсли; НачКодировки = 0; ТекКод = Сред(ДанДок,НачИП,КонИП); ТекСимв = Сред(ДанДок,Сч,1); Если (НайтиИП(ТекКод,КоррFNC)) И КоррFNC = 0 Тогда Если ЭтоЧисло(ТекСимв)И Найти(ТекКод,"(20)") Тогда СлСимв = Сред(ДанДок,Сч+1,1); КодСимв = Число(ТекСимв+СлСимв); СтрКода = СтрКода + Символ(КодСимв+32); Сч=Сч+1; Иначе СтрКода = СтрКода + ТекСимв; КонецЕсли; Иначе СтрКода = СтрКода + ТекСимв; КонецЕсли; КонецЦикла; РасшСтрока = СтрКода; ИначеЕсли ТипШК = ПланыВидовХарактеристик.ТипыШтрихкодов.Code39 Тогда РасшСтрока = СтрЗаменить(ДанДок," ", "^"); Иначе результатВыполнения = "Не удалось определить тип штрихкода."; Возврат ""; //Ошибка = Истина; КонецЕсли; Если РасшСтрока = "" Тогда Возврат ""; КонецЕсли; Если перекодироватьСимволыВЛатиницу Тогда РасшСтрока = СтрЗаменить(РасшСтрока, "^", " "); РасшСтрока = ЗаменитьСимволыАнг(РасшСтрока); КонецЕсли; Возврат РасшСтрока; КонецФункции