Имя: Пароль:
1C
1С v8
Не читается штрихкод
0 Tellkira
 
17.09.14
11:03
Здравствуйте. Помогите, пожалуйста.
В 1С (конфа на управляемых формах) формирую штрихкод следующим образом:

Функция ПолучитьШтрихкодЕАН13(Код, Организация)  Экспорт
    //только 12 символов
    //ЧисловойКод = СокрЛП(Код);
    ТекстовыйКод = ПолучитьШтрихкодБезПрефикса(код,Организация);
    
    //передача числового кода в текстовый
    //Пока Число(ЧисловойКод)<=0 Цикл
    //    ТекстовыйКод = ТекстовыйКод + Лев(ЧисловойКод,1);
    //    ЧисловойКод = Прав(ЧисловойКод,СтрДлина(ЧисловойКод)-1);
    //КонецЦикла;
    
    НовыйЧисловойКод = 0;
    
    Для а=1 По СтрДлина(ТекстовыйКод) Цикл
        
        НовыйЧисловойКод = НовыйЧисловойКод + КодСимвола(Сред(ТекстовыйКод,а,1));
        
    КонецЦикла;
    //12 цифр заходит
    НовыйКод = СокрЛП(Строка(НовыйЧисловойКод));
    НовыйКод = глДополнитьСтрокуЛ(НовыйКод,"0",12);
    
    Штрихкод = НовыйКод + глКонтрольныйСимволEAN(НовыйКод, 13);
    Возврат Штрихкод;
    
КонецФункции

Функция ПолучитьШтрихкодБезПрефикса(код,Организация)
    Префикс = Справочники.Организации.НайтиПоКоду(Организация.Код).Префикс;
    КодБезПрефикса = Прав(Код, СтрДлина(СокрЛП(Код)) - (СтрДлина(СокрЛП(Префикс)) + 3));
    Возврат КодБезПрефикса;
КонецФункции

//******************************************************************************
// глДополнитьСтрокуЛ(Стр,Чем,Длина)
//
// Параметры:
// Стр - исходная строка
// Чем - символ, которым дополняем строку
// Длина - длина, до которой заполняем строку
//
// Возвращаемое значение:
// результирующая строка
//
// Описание:
// Дополняет передаваемую строку Стр символами Чем до строки длиной Длина
// слева
Функция глДополнитьСтрокуЛ(Стр,Чем,Длина) Экспорт
Добавить=Длина-СтрДлина(Стр);
Добавок="";
Для Сч = 1 По Добавить Цикл
Добавок=Добавок+Чем;
КонецЦикла;
Возврат Добавок+Стр;
КонецФункции //глДополнитьСтрокуЛ()

//******************************************************************************
// глДополнитьСтрокуП(Стр,Чем,Длина)
//
// Параметры:
// Стр - исходная строка
// Чем - символ, которым дополняем строку
// Длина - длина, до которой заполняем строку
//
// Возвращаемое значение:
// результирующая строка
//
// Описание:
// Дополняет передаваемую строку Стр символами Чем до строки длиной Длина
// справа
Функция глДополнитьСтрокуП(Стр,Чем,Длина) Экспорт
Добавить=Длина-СтрДлина(Стр);
Добавок="";
Для Сч = 1 По Добавить Цикл
Добавок=Добавок+Чем;
КонецЦикла;
Возврат Стр+Добавок;
КонецФункции //глДополнитьСтрокуП()

Функция глКонтрольныйСимволEAN(ШтрКод, Тип) Экспорт

Четн = 0;
Нечетн = 0;

Если Тип = 13 Тогда
КолвоИтераций = 6;
Иначе
КолвоИтераций = 4;
КонецЕсли;

Для Индекс = 1 По КолвоИтераций Цикл
Четн = Четн + Сред(ШтрКод, 2 * Индекс, 1);
Нечетн = Нечетн + Сред(ШтрКод, 2 * Индекс - 1, 1);
КонецЦикла;

Если Тип = 13 Тогда
Четн = Четн * 3;
Иначе
Нечетн = Нечетн * 3;
КонецЕсли;

КонтЦифра = 10 - (Четн + Нечетн) % 10;

Возврат ?(КонтЦифра = 10, "0", Строка(КонтЦифра));

КонецФункции // глКонтрольныйСимволEAN()

//******************************************************************************
// СтрокаВЦифры((Стр)
//
// Параметры:
// Стр - Строка символов
//
// Возвращаемое значение:
// строку, сосотоящую только из символов цифр.
// Описание:
// Из исходной строки переносит в результирующую строку символы, при этом,
// если символ не является цифровым, то в результирующую строку переносится
// символ цифры, который является самым правым в коде символа исходной строки.
//
Функция СимволыВЦифры(СтрСимв) Экспорт

СтрЦифр = "";

Для Индекс = 1 По СтрДлина(СтрСимв) Цикл
ТекСимв = Сред(СтрСимв, Индекс, 1);

Если Найти("1234567890", ТекСимв) = 0 Тогда
// преобразуем символ
ТекСимв = Строка(КодСимвола(ТекСимв) % 10);
КонецЕсли;

СтрЦифр = СтрЦифр + ТекСимв;
КонецЦикла;

Возврат СтрЦифр;

КонецФункции // СтрокаВЦифры()

Функция глСформироватьШтрихкод(Префикс, ПредвКод, ТипКода=13) Экспорт

Если ТипКода = 13 Тогда
ИспКолво = 10;
Иначе
ИспКолво = 6;
КонецЕсли;

Штрихкод = СимволыВЦифры(Прав(СокрЛП(ПредвКод), ИспКолво));
Штрихкод = Префикс + глДополнитьСтрокуЛ(Штрихкод, "0", ИспКолво);

Возврат Штрихкод + глКонтрольныйСимволEAN(Штрихкод, ТипКода);

КонецФункции // глСформироватьШтрихкод()


Вывожу штрихкод на печать шрифтом EanGnc через принтер штрихкодов. Сканером штрихкода полученное не читается. Где у меня ошибка?
Стандартный вывод не работает, т.к. в конфе 2 идентичные dll для Win и Linux, а сервер у меня под Ubuntu. so файл, корректно работающий с 1С, я найти не смогла. Штрихкод формируется на сервере.
1 ИС-2
 
17.09.14
11:11
а если попробовать не через компоненту, а через шрифт EanGnivc
http://infostart.ru/public/189520/
2 Tellkira
 
17.09.14
11:13
Простите, опечаталась в названии шрифта. Я им и вывожу
3 User_Agronom
 
17.09.14
11:14
(0) ...Сканером штрихкода полученное не читается...
Предположу: в макете размерчик маловат.
4 Tellkira
 
17.09.14
11:17
Нет, масштабировала, экспериментировала с четкостью печати. Сейчас 6х3 см выводится.
Предполагаю, что проблема в префиксе, но как его формировать правильно, не в курсе: описания работы dll тоже не нашла.
5 User_Agronom
 
17.09.14
11:19
(4) Без фотки не взлетит, конечно.
Но можно попробовать не формировать штрихкод, а сразу передавать правильный. Для эксперимента, убедится что с аппаратной частью всё в порядке.
6 Любопытная
 
17.09.14
11:23
(4) А сканер вообще что-нибудь считывает? А то мож сканер не работает, а вы мучаетесь
7 Tellkira
 
17.09.14
11:24
User_Agronom, несколько не поняла Вашу мысль.
У меня штрихкод на документах ставится, потому и формирую самостоятельно.
А с оборудованием всё в порядке: штрихкоды с коробок читает только в путь.
8 Любопытная
 
17.09.14
11:28
(7) Должно работать нормально. Попробуйте прям с монитора шк считать, не печатая. Мож принтер плохо печатает. Пример набора цифр штрихкода получающегося дайте
9 Tellkira
 
17.09.14
11:33
Формируется примерно это: 0000000002974
С монитора тоже не читается.
10 Strogg
 
17.09.14
11:36
контрольный символ косячит, имхо..
11 User_Agronom
 
17.09.14
11:39
(7) Сканер читает, что напечатано другими.
Нужно убедится, что ВАШ принтер ВАШИМ механизмом печатает корректно. Вместо штрихкода можно вообще абру-кадабру передать и штрихсканер её прочитает.
Но без фотки и рецепта приготовления борща это всё равно работа впустую(( Не верите мне, спросите у Wobland
12 Tellkira
 
17.09.14
11:48
(11) Верю-не верю, к делу не относится. Фото чего именно вы хотите и что имеете ввиду под "рецептом приготовления борща"?
13 Любопытная
 
17.09.14
11:52
(11) Это, по-моему, смотря какой сканер. (12) Сканер, кстати, какой? Со штрих-кодом все нормально, сканер должен его сожрать, если он в состоянии читать EAN13
14 Любопытная
 
17.09.14
11:53
(12) Фото это традиция. Как и борщ)
15 Балоун
 
17.09.14
11:54
(14) меня хоть бы кто борщом покормил.. но я согласен и на творог с перцем ;)
16 Tellkira
 
17.09.14
11:55
(13) Сканер Posiflex Honeywell, настройка через эмуляцию com-порта.
Я новичок, не в курсе фото и борщей.
17 Балоун
 
17.09.14
11:56
(16) без фото не взлетает никогда, как ни старайся
18 Любопытная
 
17.09.14
11:57
(16) А если включить его просто клавиатурным?
Клавиатурному сканеру уж точно должно быть плевать, что у вас там написано, он считает и выведет
19 Любопытная
 
17.09.14
11:59
(15) Вы слишком много знаете для незнакомца ;)
20 Балоун
 
17.09.14
12:00
(19) отличный повод исправить положение незнакомца ;)
21 Tellkira
 
17.09.14
12:01
(18) Клавиатурный вариант тоже не читает.
22 Любопытная
 
17.09.14
12:01
(20) Еще чуть-чуть и этот ник тоже забанят за флуд
23 Любопытная
 
17.09.14
12:02
(21) Тогда давайте разбираться куда он не читает. Не читает в 1С или вообще?
24 Любопытная
 
17.09.14
12:03
Я считаю, что дело не в сформированном штрихкоде, а в оборудовании
25 Балоун
 
17.09.14
12:03
(22) а их войско
26 Любопытная
 
17.09.14
12:03
(25) Лучше помоги девушке
27 Балоун
 
17.09.14
12:04
чем вы тут занимаетесь вообще? исправность сканера (клавиатурного) проверяется сканированием в блокнтом пачки сигарет
28 Tellkira
 
17.09.14
12:05
(24) мои штрихкоды он не читает даже в тесте. Сигаретные пачки сканирует норм.
29 Любопытная
 
17.09.14
12:05
(27) Сканер с коробки читает, а сгенерированное не читает. Не должно ли сканеру быть пофиг, какие там палки? Клавиатурному по-моему должно
30 Балоун
 
17.09.14
12:06
(28) фотку вставляла? контрольную цифру проверяла?
31 Балоун
 
17.09.14
12:08
(29) родное правительство как-то перед выборами выдало нескольким конторам скидочные карты для пенсионеров. единый штрихкод на всех-всех-всех и с кривой контрольной цифрой ;)
32 Балоун
 
17.09.14
12:08
+(31) так вот, у нас вроде бывал клавиатурный. допиливали конфигурацию
33 Любопытная
 
17.09.14
12:09
(31) я проверяла контрольную цифру из (9) Правильно. Говорят сделано в США или Канаде ;)
34 Tellkira
 
17.09.14
12:14
(30) Я вставляю не фото, а вывожу сразу шрифтом. У меня нет so, который бы формировал этот штрихкод. Контрольная цифра верна, префикс - 0, с префиксом 2 тоже не читает.
35 Балоун
 
17.09.14
12:16
фото вставляется здесь: http://www.forum.mista.ru/users_photo.php?id=99250
36 Любопытная
 
17.09.14
12:18
(34) А вы прям шк из (9) мучаете? У меня сканера нет под рукой, чтоб проверить, но по идее должен считаться.
37 Любопытная
 
17.09.14
12:18
А если напечатать на принтере шк с пачки сигарет, прочитается?
38 Любопытная
 
17.09.14
12:21
В штрихкодах вся соль в контрольной цифре и только в ней. Если контрольная цифра посчитана правильно, то он должен считаться.
39 Tellkira
 
17.09.14
13:08
Решила проблему.
Я вывожу на печать просто цифры. А штрихкод - штука не такая простая. Не хватало одной функции, обрабатывающей штрихкод перед печатью.

Функция ПолучитьЕАН13НаПечать (ШтрихкодСтрокойСимволов) Экспорт
     Попытка
        Тест = Число(ШтрихкодСтрокойСимволов);
    Исключение
        ВызватьИсключение "Штрихкод может содержать только цифры";
    КонецПопытки;

    СимволыСпособовКодирования = "#$%&'()*+,";
    ЛевыйЗащитныйШаблон = "!";
    СреднийЗащитныйШаблон = "-";
    ПравыйЗащитныйШаблон = "!";

    СимволыШрифтаПоТипамКодов = Новый Соответствие;
    СимволыШрифтаПоТипамКодов.Вставить("L", "0123456789");
    СимволыШрифтаПоТипамКодов.Вставить("G", "ABCDEFGHIJ");
    СимволыШрифтаПоТипамКодов.Вставить("R", "abcdefghij");

    СпособыКодированияЛевойЧасти = Новый Массив;
    СпособыКодированияЛевойЧасти.Добавить("LLLLLL");
    СпособыКодированияЛевойЧасти.Добавить("LLGLLG");
    СпособыКодированияЛевойЧасти.Добавить("LLGGLG");
    СпособыКодированияЛевойЧасти.Добавить("LLGGGL");
    СпособыКодированияЛевойЧасти.Добавить("LGLLGG");
    СпособыКодированияЛевойЧасти.Добавить("LGGLLG");
    СпособыКодированияЛевойЧасти.Добавить("LGGGLL");
    СпособыКодированияЛевойЧасти.Добавить("LGLGLG");
    СпособыКодированияЛевойЧасти.Добавить("LGLGGL");
    СпособыКодированияЛевойЧасти.Добавить("LGGLGL");

    СпособКодированияПравойЧасти = "RRRRRR";

    Если СтрДлина(ШтрихкодСтрокойСимволов) = 13 Тогда
        КоличествоСимволовВГруппе = 6;
    ИначеЕсли СтрДлина(ШтрихкодСтрокойСимволов) = 8 Тогда
        КоличествоСимволовВГруппе = 4;
        СимволыСпособовКодирования = "";
        ШтрихкодСтрокойСимволов = "0"+ШтрихкодСтрокойСимволов;
    Иначе
        ВызватьИсключение "Поддерживаются только штрихкоды длиной 13 и 8 символов";
    КонецЕсли;

    ИндексСпособаКодирования = Число(Лев(ШтрихкодСтрокойСимволов,1));

    ЛеваяЧастьКода = "";
    ПраваяЧастьКода = "";

    Для ИндексСимвола = 1 По КоличествоСимволовВГруппе Цикл
        ЛеваяЧастьКода = ЛеваяЧастьКода
            + Сред(СимволыШрифтаПоТипамКодов[Сред(СпособыКодированияЛевойЧасти[ИндексСпособаКодирования],ИндексСимвола,1)]
                    ,Число(Сред(ШтрихкодСтрокойСимволов,(ИндексСимвола+1),1))+1
                    ,1);
        ПраваяЧастьКода = ПраваяЧастьКода
            + Сред(СимволыШрифтаПоТипамКодов[Сред(СпособКодированияПравойЧасти,ИндексСимвола,1)]
                    ,Число(Сред(ШтрихкодСтрокойСимволов,(ИндексСимвола+КоличествоСимволовВГруппе+1),1))+1
                    ,1);
    КонецЦикла;

    Результат = ""  + Сред(СимволыСпособовКодирования,ИндексСпособаКодирования+1,1)
                    + ЛевыйЗащитныйШаблон
                    + ЛеваяЧастьКода
                    + СреднийЗащитныйШаблон
                    + ПраваяЧастьКода
                    + ПравыйЗащитныйШаблон;
                    
                    Возврат Результат;
    
    КонецФункции
40 Tellkira
 
17.09.14
13:09
Спасибо всем :-)
41 Любопытная
 
17.09.14
13:10
Жесть какая. И что в итоге выдает эта функция на выходе?
42 Балоун
 
17.09.14
13:11
(40) спасибу на рабочий стол не положишь
43 Балоун
 
17.09.14
13:13
(41) что-то явно длиннее 13 символов при ЕАН13
44 Балоун
 
17.09.14
13:14
(43) или неявно. или контрольная цифра так хитро считается
45 Любопытная
 
17.09.14
13:14
(42) Ты чем-нибудь помог, чтоб намекать на борщ?)
46 Балоун
 
17.09.14
13:14
(45) я готов покушать безвозмездно
47 User_Agronom
 
17.09.14
13:51
(12) Фото чего именно вы хотите и что имеете ввиду под "рецептом приготовления борща"?
Да, загадочно всё это. Особенно неизведанная вещь под названием "рецепт приготовления борща".
48 Tellkira
 
17.09.14
21:19
(47) Эх. Вот вам рецепт приготовления борща:
Покупаем в магазине мозговые кости, желательно кусок позвоночника и пару коленных. Вывариваем их на слабом огне в подсоленной воде полдня. Затем достаём то, что осталось от костей, соскребаем с них мясо (можно его положить в бульон) и кидаем в бульон пару очищенных и нарезанных свёколок. Варим с час. Дальше кидаем картошку, капусту (не обязательно, но мне нравится), лук, морковку. Всё, естественно, порезанное. Досаливаем, перчим и варим с полчасика. Потом кидаем лавровый лист, прочие приправы по вкусу и через 5 минут выключаем. Лопать со сметаной.
49 Torquader
 
17.09.14
22:46
(48) Вот если бы вы также подходили к вопросу печати штрих-кода, то у вас бы всё сразу получилось.
50 User_Agronom
 
17.09.14
23:59
(48) Незачет. Фото можно не ставить.
Таким борщём можно удовлетворить молодого студента, но никак не старого, седого одинэсника.
51 acanta
 
18.09.14
00:06
(50) молодого студента тоже не удовлетворишь
52 acanta
 
18.09.14
00:07
(51)+ разве что сантехника из ЖЭКа..
53 User_Agronom
 
18.09.14
00:21
(51) Pardon, поправлюсь:
Таким борщём может и есть шанс удовлетворить молодого студента, но никак не старого, седого одинэсника.

Давно студеном был, подзабыл.))
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший