Генерация qr кода с помощью api google + ITF14 при помощи «1С печать штрихкодов»
По рабочему вопросу понадобилась печать стикера с QR 2Д и ITF-14 кодом. Сторонние решения для 1С не устраивали своей жадностью, а бесплатных решений кроме вот этого найдено не было. Очень помогла в разработке публикация http://infostart.ru/public/80106/ Скачать измененную версию можно здесь: http://infostart.ru/public/147843/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
Функция hex(Знач Значение) Значение=Число(Значение); Если Значение<=0 Тогда Результат="0"; Иначе Значение=Цел(Значение); Результат=""; Пока Значение>0 Цикл Результат=Сред("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Значение%16 + 1,1)+Результат; Значение=Цел(Значение/16) ; КонецЦикла; КонецЕсли; Если СтрДлина(Результат) < 2 Тогда Результат = "0" + Результат; КонецЕсли; Возврат "%" + Результат; КонецФункции Функция EncodeURL(URL) Рез = ""; Для Сч = 1 По СтрДлина(URL) Цикл ch = Сред(URL,Сч,1); vch = КодСимвола(ch); Если ("A" <= ch ) И ( ch <= "Z") Тогда // "A".."Z" Рез = Рез + ch; ИначеЕсли ("a" <= ch ) И ( ch <= "z") Тогда // "a".."z" Рез = Рез + ch; ИначеЕсли ("0" <= ch ) И ( ch <= "9") Тогда // "0".."9" Рез = Рез + ch; ИначеЕсли (ch = " ") ИЛИ ( ch = "+") Тогда // space Рез = Рез + "+"; ИначеЕсли (ch = "-" ) ИЛИ ( ch = "_") // unreserved ИЛИ (ch = ".") ИЛИ (ch = "!") ИЛИ (ch = "~") ИЛИ (ch = "*") ИЛИ (ch = "") ИЛИ (ch = "(") ИЛИ (ch = ")") Тогда Рез = Рез + ch; ИначеЕсли (vch <= 127) Тогда // other ASCII Рез = Рез + hex(vch); ИначеЕсли (vch <= 2047) Тогда // non-ASCII <= 0x7FF Рез = Рез + hex(192 + Цел(vch / 64)); Рез = Рез + hex(128 + (vch % 64)); Иначе // 0x7FF < ch <= 0xFFFF Рез = Рез + hex(224 + Цел(vch / 4096)); Рез = Рез + hex(128 + (Цел(vch / 64) % 64)); Рез = Рез + hex(128 + (vch % 64)); КонецЕсли; КонецЦикла; Возврат Рез; КонецФункции // () Функция СохранитьДвоичныйБуферВФайл(Буфер, ИмяФайла) Экспорт Поток = Новый COMОбъект("ADODB.Stream"); Поток.Type = 1; //Бинарный Поток.Mode = 3; Поток.Open(); Поток.Write(Буфер); Поток.SaveToFile(ИмяФайла); Поток.Close(); КонецФункции Процедура КнопкаВыполнитьНажатие(Кнопка) Если НЕ ЗначениеЗаполнено(Контрагент) Тогда Предупреждение("Не указан контрагент!"); Возврат; КонецЕсли; Если НЕ ЗначениеЗаполнено(Номенклатура) Тогда Предупреждение("Не выбрана номенклатура!"); Возврат; КонецЕсли; Если НЕ ЗначениеЗаполнено(ДатаВыпуска) Тогда Предупреждение("Не указана дата розлива!"); Возврат; КонецЕсли; Если НЕ ЗначениеЗаполнено(КоличествоЭтикеток) Тогда Предупреждение("Не указано количество экземпляров!"); Возврат; КонецЕсли; ТабДок = Новый ТабличныйДокумент; Макет = ПолучитьМакет("Стикер"); НомерИнвойса = "00000000"; // затычка! Попытка АртикулЧисло = Число(Номенклатура.Артикул); Исключение АртикулЧисло = 0; КонецПопытки; ТекстКода = "*" + НомерИнвойса + Формат(АртикулЧисло, "ЧЦ=13; ЧВН=; ЧГ=0") + "" + Формат(ДатаВыпуска, "ДФ=yyyyMMdd") + ПризнакТипаУпаковки + "*"; Макет.Параметры.КодЗаказчика = Номенклатура.Артикул; Макет.Параметры.ДатаРозлива = Формат(ДатаВыпуска, "ДФ=dd.MM.yyyy"); Макет.Параметры.НоменклатураПолноеНаименование = Номенклатура.НаименованиеПолное; Макет.Параметры.КонтрагентПолноеНаименование = Контрагент.НаименованиеПолное; Макет.Параметры.АдресКонтрагента = УправлениеКонтактнойИнформацией.ПолучитьАдресИзКонтактнойИнформации(Контрагент, "Юридический"); Макет.Параметры.ТелефонКонтрагента = "Тел " + УправлениеКонтактнойИнформацией.ПолучитьТелефонИзКонтактнойИнформации(Контрагент, Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента); //Макет.Рисунки.QRCode.Объект.Data = ТекстКода; Сообщить("2D код: " + ТекстКода); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ | Штрихкоды.Штрихкод как штр |ИЗ | РегистрСведений.Штрихкоды КАК Штрихкоды |ГДЕ | Штрихкоды.Владелец = &Владелец | И Штрихкоды.ТипШтрихкода = &ТипШтрихкода"; Запрос.Параметры.Вставить("Владелец", Номенклатура); Запрос.Параметры.Вставить("ТипШтрихкода", ПланыВидовХарактеристик.ТипыШтрихкодов.ITF14); ИмяВременногоФайла = ПолучитьИмяВременногоФайла("png"); АдресНачало = "http://chart.apis.google.com/chart?cht=qr&chs=230x230&chld=H|0&chl="; АдресКонец = ТекстКода; АдресКонец = СтрЗаменить(АдресКонец, " ", "+"); АдресКонец = EncodeURL(АдресКонец); Соединение = ПолучитьCOMОбъект("","Microsoft.XMLHTTP"); Соединение.open("GET", АдресНачало + АдресКонец,0,,); Соединение.send(null); СохранитьДвоичныйБуферВФайл(Соединение.responseBody, ИмяВременногоФайла); //Печать Макет.Рисунки.D10.Картинка = Новый Картинка(ИмяВременногоФайла); ТаблицаШТ = Запрос.Выполнить().Выгрузить(); Макет.Рисунки.D2.Объект.Сообщение=0; для каждого кц из ТаблицаШТ цикл Макет.Рисунки.D2.Объект.Сообщение=кц.штр; //сообщить(кц.штр); конеццикла; яч=строка(Макет.Рисунки.D2.Объект.Сообщение)+"!"; если яч="0!" тогда сообщить("АХТУНГ! Не назначен EAN-14!!!"); конецесли; Для Ш = 1 По КоличествоЭтикеток Цикл ТабДок.Вывести(Макет); ТабДок.ВывестиГоризонтальныйРазделительСтраниц(); КонецЦикла; ТабДок.ТолькоПросмотр = Истина; ТабДок.Показать(); КонецПроцедуры Процедура ПриОткрытии() Контрагент = Справочники.Контрагенты.НайтиПоКоду("000000012"); КонецПроцедуры |
Ах ты ж хитрая ж..
Это пять баллов!