Генерация qr кода с помощью api google + ITF14 при помощи «1С печать штрихкодов»

По рабочему вопросу понадобилась печать стикера с QR 2Д и ITF-14 кодом. Сторонние решения для 1С не устраивали своей жадностью, а бесплатных решений кроме вот этого найдено не было. Очень помогла в разработке публикация http://infostart.ru/public/80106/ Скачать измененную версию можно здесь: http://infostart.ru/public/147843/

Функция 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");

КонецПроцедуры

Комментарии:

1 мысль о “Генерация qr кода с помощью api google + ITF14 при помощи «1С печать штрихкодов»”

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.