Имя: Пароль:
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
 
naïve
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, поправлюсь:
Таким борщём может и есть шанс удовлетворить молодого студента, но никак не старого, седого одинэсника.

Давно студеном был, подзабыл.))
Закон Брукера: Даже маленькая практика стоит большой теории.