Имя: Пароль:
1C
 
Знатокам штрихкодов : Кодирования русских букв в Code-128
,
0 bvb
 
11.12.15
12:46
Первый вопрос можно ли в нем вообще кодировать русский алфавит

я закодировал номер документа 361д-15
у меня получилось (20)361l-15(15)(10)(10)(10)

Можно ли его нормально закодировать и если как до где копать ?
1 Михаил Козлов
 
11.12.15
12:48
Не проще использовать УИД?
2 bvb
 
11.12.15
13:14
(1) Клиент требует палетную этикетку с номером накладной в Code-128
3 vde69
 
11.12.15
13:17
Глобальный контекст (Global context)
Base64Строка (Base64String)
Синтаксис:

Base64Строка(<Значение>)
Параметры:

<Значение> (обязательный)

Тип: ДвоичныеДанные.
Двоичные данные, которые необходимо закодировать по алгоритму base64.
Возвращаемое значение:

Тип: Строка.

Описание:

Получает строку, закодированную по алгоритму base64.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
См. также:

Глобальный контекст, метод Base64Значение

--------------------------------------------------------------------------------

     Методическая информация
4 Лефмихалыч
 
11.12.15
13:17
code 128 русских буков не знает. Исзобретай какие-то велосипеды
5 Garykom
 
гуру
11.12.15
13:24
(4) да и простейший это (3)
6 Garykom
 
гуру
11.12.15
13:25
7 Лефмихалыч
 
11.12.15
13:26
(5) строку с номером в файл, потом из этого файла двоичные данные, потом из них базе64строка? это простейший штоле? о_0
8 Garykom
 
гуру
11.12.15
13:26
(7) какие в жпо двоичные данные? может иногда лучше промолчать если не в курсе да?
9 Garykom
 
гуру
11.12.15
13:27
10 Лефмихалыч
 
11.12.15
13:28
(8) Base64Строка() на вход двоичные данные требует. Автору надо в ШК поместить номер документа. Как из номера документа получить Base64Строка()?
11 Лефмихалыч
 
11.12.15
13:31
(0) может просто напросто:
КодироватьСтроку("361д-15", СпособКодированияСтроки.КодировкаURL)
м?
12 Garykom
 
гуру
11.12.15
13:33
Функция КодироватьBase64(Текст) // (с) Decker
    Перем Алфавит;
    Перем Группа, Символ;
    Перем Значение, Разряд;
    Перем Символ6, Значение6;
    Перем Значение8, Символ8;
    Перем Текст64;
    
    // Подготовка алфавита и результата
    Алфавит = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    Текст64 = "";
          
    Группа = "";
    Для Номер=1 По СтрДлина(Текст) Цикл
    
    Символ = Сред(Текст, Номер, 1);
    Группа = Группа + Символ;
    
    Если ((СтрДлина(Группа) = 3) или (Номер = СтрДлина(Текст))) Тогда
        
        // Получение числового значения из 3-х символов
            Значение = 0;
            Разряд = 2;
            Пока Разряд >= 0 Цикл
                Символ8 = Сред(Группа, 3 - Разряд, 1);
                Значение8 = КодСимв(Символ8);
                Если Разряд = 1 Тогда
                    Значение8 = Значение8 * 256;
                ИначеЕсли Разряд = 2 Тогда
                    Значение8 = Значение8 * 256 * 256;
                КонецЕсли;
                Значение = Значение + Значение8;
                Разряд = Разряд - 1;
            КонецЦикла;
            
        // Получение 4-х символов из числового значения    
            Разряд = 3;
            Пока Разряд >= 0 Цикл
                Значение6 = Значение;
                Если Разряд = 3 Тогда
                    Значение6 = Цел(Значение6 / 64 / 64 / 64);
                    Значение = Значение - Значение6 * 64 * 64 * 64;
                ИначеЕсли Разряд = 2 Тогда
                    Значение6 = Цел(Значение6 / 64 / 64);
                    Значение = Значение - Значение6 * 64 * 64;
                ИначеЕсли Разряд = 1 Тогда
                    Значение6 = Цел(Значение6 / 64);
                    Значение = Значение - Значение6 * 64;
                КонецЕсли;      
                
                Если СтрДлина(Группа) < 3 Тогда
                    Если Значение6 = 0 Тогда
                        Значение6 = 64;
                    КонецЕсли;
                КонецЕсли;

                Символ6 = Сред(Алфавит, Значение6+1,1);
                Текст64 = Текст64 + Символ6;
                Разряд = Разряд - 1;
            КонецЦикла;    
                        
        Группа = "";    
        КонецЕсли;
    КонецЦикла;  
    
    Возврат Текст64;
    
КонецФункции // КодироватьBase64()

http://dml.compkaluga.ru/forum/index.php?showtopic=73815
13 Лефмихалыч
 
11.12.15
13:36
(12) да куда уж проще-то...
14 bvb
 
11.12.15
13:47
КодироватьBase64(365l-15) ==> MzYxC0xNSAgIB//
15 Лефмихалыч
 
11.12.15
13:57
(14) осталось найти еще 60 строк, которые раскодируют это обратно
16 Garykom
 
гуру
11.12.15
13:57
(14) все правильно только латинские буквы остались и спецсимволы все что подходит для Code 128b https://en.wikipedia.org/wiki/Code_128
17 Garykom
 
гуру
11.12.15
13:57
(15) там (12) внизу ссылка вообще то...
18 Лефмихалыч
 
11.12.15
14:01
Сообщить(КодироватьСтроку("361д-15", СпособКодированияСтроки.КодировкаURL));
Сообщить(РаскодироватьСтроку("361%D0%B4-15", СпособКодированияСтроки.КодировкаURL));

361%D0%B4-15
361д-15

мне кажется - так проще. Две строки, штатно, и без ссылок в какой-то хрен знает куда
19 Garykom
 
гуру
11.12.15
14:02
(18) можно и так, а можно и вообще транслитом воспользоваться
20 Лефмихалыч
 
11.12.15
14:03
(19) для транслита тоже надо две функции по полста строк руками писать
21 Garykom
 
гуру
11.12.15
14:05
(20) там по 5 строк всего через цикл и стрзаменить
22 Локи-13
 
11.12.15
14:06
(18) Голосую за этот вариант
23 Лефмихалыч
 
11.12.15
14:07
(21) ну, во-первых, для обеспечения преобразования туда-сюда без потерь всяких Ж, Ш, З и т.д. надо больше 5 строк и СтрЗаменить. Во-вторых - какая разница, сколько писать, если условия таковы, что все написано за нас?
24 Garykom
 
гуру
11.12.15
14:08
(23) где нибудь указание на версию платформы 1С увидел?
25 bvb
 
11.12.15
15:26
(24) Платформа 8.2
ДекодироватьBase64(КодироватьBase64(361д-15))
Вывел в штрихкод

Сканер считал что то типа : 361LMH

Короче тема пустая ибо сканер русские символы не распознает в CODE-128

Поэтому похоже (4)  :(
26 Лефмихалыч
 
11.12.15
15:29
(25) зачем выводи в штрихкод КодироватьBase64(361д-15)

ДЕкодировать тебе понадобится, при обработке данных от сканера
27 bvb
 
11.12.15
15:36
Дык декодировать буду не я а клиент
28 Лефмихалыч
 
11.12.15
15:38
(27) и что клиент будет делать с номером твоего документа? Ты этот номер ему в каких-то электрических выгрузках передаешь что ли?
29 Лефмихалыч
 
11.12.15
15:39
или это номер тебе клиент дает?
30 Serginio1
 
11.12.15
15:45
31 Garykom
 
гуру
11.12.15
15:47
(25) предлагаю отказаться от кириллицы в номерах документов
32 Garykom
 
гуру
11.12.15
15:47
(31)+ ну или запилить свой стандарт вместо всех https://ru.wikipedia.org/wiki/Сравнение_характеристик_штрихкодов
33 NorthWind
 
11.12.15
15:53
Я бы не заморачивался с base64, а сделал бы свою таблицу соответствия русских букв и латинских, что-то типа транслита. И ей бы кодировал. Это будет экономичнее, потому что base64 очень громоздкий
34 Злопчинский
 
11.12.15
16:01
(33) осталось понять - если в сиходном сообщении есть родные латинские буквы - при раскодировке - что делать..?
35 Garykom
 
гуру
11.12.15
16:12
(34) стандартно "а">"a", "a">"\a", "\">"\\"
36 Garykom
 
гуру
11.12.15
16:14
(35)+ из "ТестTest" будет "Test\T\e\s\t"
37 Лефмихалыч
 
11.12.15
16:18
все заметили, да, что автору штрихкод нужен, чтобы передавать этот штрих-код контрагенту? Или у меня глюки?
38 NorthWind
 
11.12.15
16:46
(36) Ну да. Или же, наоборот, использовать двухсимвольные последовательности для латиницы, если вероятность ее появления в сообщении ниже, чем кириллицы. А может, у автора вообще исключена латиница. Мы ж не знаем.
39 NorthWind
 
11.12.15
16:50
(37) заметил, но дело в том что там ничего не написано по поводу стандартов. Если клиенту нужен SSCC, то я не знаю, при каком там кириллица
40 NorthWind
 
11.12.15
16:51
да и SSCC это EAN (или GS1) - 128, а не CODE128
41 zippygrill
 
11.12.15
17:02
Функция КонвертацияИзКириллицы(Знач ИсходнаяСтрока)
    СтрокаЛатиницы  = "abcdefghijklmnopqrstuvwxyz""#$&',./:;<>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^`{|}~";
    СтрокаКириллицы = "фисвуапршолдьтщзйкыегмцчняЭ№;?эбю.ЖжБЮ,""ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯх\ъ:ёХ/ЪЁ";
    ДлинаИсходнойСтроки = СтрДлина(ИсходнаяСтрока);
    РезультирующаяСтрока = "";
    Для ТекущаяПозиция = 1 По ДлинаИсходнойСтроки Цикл
        ТекущийСимвол = Сред(ИсходнаяСтрока,ТекущаяПозиция,1);
        Позиция = Найти(СтрокаКириллицы, ТекущийСимвол);
        Если Позиция = 0 Тогда
            РезультирующаяСтрока = РезультирующаяСтрока + ТекущийСимвол;
        Иначе
            РезультирующаяСтрока = РезультирующаяСтрока + Сред(СтрокаЛатиницы,Позиция,1);
        КонецЕсли;
    КонецЦикла;
    Возврат РезультирующаяСтрока;
КонецФункции // КонвертацияИзКириллицы()
42 IlyaSR
 
11.12.15
17:12
Что мешает в Штрихкод сформировать на основе УИД, а под ним вывести номер документа строкой )))
43 Garykom
 
гуру
11.12.15
17:20
(41) зачем столько кода?

Функция Транслит(СтрокаВходящая)
    Результат = СтрокаВходящая;
    СтрокаЛатиницы  = "abcdefghijklmnopqrstuvwxyz""#$&',./:;<>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^`{|}~";
    СтрокаКириллицы = "фисвуапршолдьтщзйкыегмцчняЭ№;?эбю.ЖжБЮ,""ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯх\ъ:ёХ/ЪЁ";
    Для НомерСимвола = 1 По СтрДлина(СтрокаКириллицы) Цикл
        Результат = СтрЗаменить(Результат,Сред(СтрокаКириллицы, НомерСимвола, 1), Сред(СтрокаЛатиницы, НомерСимвола, 1));
    КонецЦикла;
    Возврат Результат;
КонецФункции


ЗЫ строки поправить замен как нуна, переделка для замен "Ш">"SH" тоже не проблема
44 etc
 
11.12.15
17:20
(0) поинтересуйся у клиента для которого стараешся, пусть приведет пример штрих-кода с кириллицей который они успешно считывают. А то сдается мне если не через URL кодирование то еще и кодовую страницу будете согласовывать, UTF, или вообще KOI-8 :)
45 etc
 
11.12.15
17:22
(43) если бы не разное количество букв в алфавитах ...
46 Mikeware
 
11.12.15
17:23
(43) транслит убивает однозначность. Для того, чтобы впихнуть аски в пол-аски, достаточно поднять систему всего вдвое.
хотя можно тупо применить префикс - расширив вдвое код.
47 Garykom
 
гуру
11.12.15
18:01
(45) не вижу проблем использовать " " в кодовых строках и по 2 символа " ш ч"="shch"
48 lEvGl
 
гуру
11.12.15
18:14
в (30) привели нормальный вариант, изобретать велосипед не нужно, уже есть - ASCII (любая другая кодировка), клиенту сказать, что закодировано по международному стандарту, пусть расшифровку делает в обратном порядке, будет возмущаться - на педивикию отправить и сказать, что он не в тренде и не пользуется общепринятыми Мировыми стандартами
пс. а придумывать свою таблицу кодировки - себе дороже, потом придется объяснять расшифровщику что да как, интересно что он еще подумает
49 lEvGl
 
гуру
11.12.15
18:35
я может чего не понял... в 1с юникод

Для Н = 1 По СтрДлина(Строка) Цикл
Результат = Результат + КодСимвола(Сред(Строка, Н, 1)) + ";";
КонецЦикла;

при разборе

Массив = РазложитьСтрокуВМассив....(СтрокаИзСканера, ";");
Для каждого Строка Из Массив Цикл
Результат = Результат + Символ(Строка);
КонецЦикла;

если разбор не в 1с, то инструментами среды Encoding там или еще чего
50 lEvGl
 
гуру
11.12.15
18:36
в чем дело то, полсотни постов ;)
51 etc
 
11.12.15
18:44
(48) ASCII по большому счету стандарт только на первые 128 символов. Есть несколько вариаций размещения в верхних 128-256 кодах ASCII национальных символов что и обозначается кодировкой. Например KOI8R, CP866 и т.д.
52 etc
 
11.12.15
18:45
(51)+ поэтому я и говорю что в таком варианте ему еще и кодировку с клиентом придется согласовывать.
53 lEvGl
 
гуру
11.12.15
19:03
(51) интересно как будет выглядеть 361д-15 в казахском варианте, тогда надо и номенклатуру кодировать и все остальные тексты, что бы клиент, родной, не чувствовал себя ущемленным
54 etc
 
11.12.15
19:27
(53) мне кажется его клиенту для которого он старается еще не попадались документы с кириллицей в номере.
Ошибка? Это не ошибка, это системная функция.