v8.x: QR код в 1С - 1С-ИнтеГрация

v8.x: QR код в 1С



 Столкнулся с интересной задачей реализации генерации QR-кода в 1С 8.2 ( QR-код — матричный код (двухмерный штрихкод) ) Для генерации было использовано api от google (http://chart.apis.google.com/chart). Вот сайт, который работает с ним. После того, как вы вводите все параметры кода и нажимаете кнопку генерировать, получаем что-то вроде такой ссылки. По сути эта ссылка нам и нужна. Создав необходимый url можно скачать картинку, которая генерируется с помощью api. 
И так в чем заключается подход:
 
1. Генерируем текст, который надо прописать в qr-коде.
 
2. Используя ссылку «http://chart.apis.google.com/chart?cht=qr&chs=230?230&chl=» +»Наш текст» скачиваем картинку.
 
3. Размещаем картинку в нашем табличном документе.
 
Код реализации:
 

Код 1C v 8.2 УП

 &НаСервере

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

КонецФункции

 

&НаСервере

Функция НапечататьКодСервер(ЗаказСсылка)

    ТабДок = Новый ТабличныйДокумент;

    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("png");

    АдресНачало = "http://chart.apis.google.com/chart?cht=qr&chs=230x230&chl=";

    АдресКонец = ЗаказСсылка.Номер  + Символы.ПС + Заказссылка.Контрагент.Наименование;

    АдресКонец = СтрЗаменить(АдресКонец, " ", "+");

    АдресКонец = EncodeURL(АдресКонец);

 

    Соединение = ПолучитьCOMОбъект("","Microsoft.XMLHTTP");

    Соединение.open("GET", АдресНачало + АдресКонец,0,,);

    Соединение.send(null);

    СохранитьДвоичныйБуферВФайл(Соединение.responseBody, ИмяВременногоФайла);

 

    //Печать

    Макет = Документы.ЗаказПокупателя.ПолучитьМакет("МакетПечатиКода");

    Область = Макет.ПолучитьОбласть("Код");

    Область.Рисунки.КодРисунок.Картинка = Новый Картинка(ИмяВременногоФайла);

    ТабДок.Вывести(Область);

    Возврат ТабДок;

КонецФункции  


Источник



Назад в раздел