Упаковка строк/массивов строк/таблиц/массивов таблиц в QR Code без ВК с поддержкой русских букв через Google API/локальный сервер

Функция позволяет генерировать QRCode из строк/масс.строк/ТЗ/масс.тз  2-мя способами:
1. Через Google API (требует наличия интернета)
2. Через собственный веб-сервер (у меня стоит Denwer, но должен подойти любой)

Поддержка русских букв. Проверено на планшетнике с Андроидом //что было в наличии, тем и проверял

Клиент попросил сделать QR код на отгрузочных документов для удобства внесения в свою базу. 

На основе //infostart.ru/public/137613/ написал свою функцию, избавившись от COMОбъектов Microsoft.XMLHTTP и ADODB.Stream.

C Get запроса перешел на Post, т.к. у Get ограничение в 2кб, а у Post ограничение только самого QR кода (а именно 4296 знаков при использовании кириллицы)

Картинка с кодом выводится в независимости от макета, т.е. макеты документов, справочников и т.д. редактировать не требуется (что для меня огромный плюс). 


Итого имеем:

— генерируем QR-Code без ВК и внешних сервисов.

— не нужно править макеты, только добавить неск. строк кода в формирование макета

— если все же нужно, то можно в макет добавить картинку под код и передать её область в качестве параметра в функцию

— в код можно запихивать строки, таблицы значений, массивы строк и таблиц значений

— работает в управляемых формах (на веб-клиенте пока не проверял, но думаю проблем не будет)

— самый огромный плюс — возможность быстрой загрузки документа у контрагента (приемка продукции по сопроводительным листам, ввод ТТН, СФ и т.д.) с бумажного носителя.

 

В данном коде используются разработки/ПО:

//infostart.ru/public/137613/ — идея, функции конвертации в UTF+hex

http://tcpdf.org — QR Code generator,  PHP QR Code

http://www.denwer.ru/ — Apache/PHP Web Server

 

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

— Сериализация номенклатуры в код использована для уменьшения размера QR Code и увеличения вместимости данных, т.к. иногда наименование получается очень большим и выводить его в каждой строке было бы расточительным.

— Для раскраски кода использовал http://www.oscomp.ru/1Color.php , т.к. я новичок и скачать разукрашку не могу

— Код функции лежит в файлах. Файлы для денвера там же. Сам денвер можно скачать по ссылке выше

— С помощью файлов PHP QRCode можете сделать сервер генерации QRCode на своем сайте 😉 Например, быстрые ссылки для страничек.

 

В планах:

— Масштабирование области под размер кода, т.к. не всегда код влезает в область, а иногда размер области избыточен.

 

Будут вопросы — спрашивайте, отвечу 🙂

 

*****

Инсталляция:

В 1С:

1. Добавьте функции в любой имеющийся модуль с возможностями вызова сервера клиентом, либо создайте новый

2. В общих макетах создайте макет с именем МакетПечатиКода. В нем добавьте картинку с именем КодРисунок и укажите область в макете с именем Код 

3. В нужных участках кода добавьте соответствующий код

 

Для использования локального веб-сервера:

1. На любом компьютере установите Денвер, настройте права. Создайте папку и разархивируйте туда файлы из вложения.

2. Адрес сервера вписать в код функции. У меня вебсервер стоит на локальной машине, папка с файлами QRCode. Соответственно, в функции Новый HTTPСоединение(«localhost/QRCode»);

*****

 

Например, код формирования картинки в анонс этой публикации:

&НаКлиенте
Процедура ВывестиКод()
ТабДок = Новый ТабличныйДокумент;
Область = ИнтересныеФишки.НапечататьКодСервер("QR Code генератор с кириллицы выводом в любой макет/Табдок",,,ТабДок);
Если Область=Неопределено Тогда
Сообщить("Ошибка формирования кода");
Иначе
ТабДок.Показать();
КонецЕсли;
КонецПроцедуры

 

Использование у меня в конфигурации

// формируем шапку для QR кода
ТЗШапка = Новый ТаблицаЗначений;
ТЗШапка.Колонки.Добавить("Клиент");
ТЗШапка.Колонки.Добавить("NДок");
ТЗШапка.Колонки.Добавить("ДатаДок");

ТЗСериализацияНоменклатуры = Новый ТаблицаЗначений;
ТЗСериализацияНоменклатуры.КОлонки.Добавить("Номенклатура");
ТЗСериализацияНоменклатуры.КОлонки.Добавить("Код");

ТЗДляКода = Новый ТаблицаЗначений;
ТЗДляКода.Колонки.Добавить("Номенклатура");
 ТЗДляКода.Колонки.Добавить("Характеристика1");
 ТЗДляКода.Колонки.Добавить("Характеристика2");
 //-- формируем шапку для QR кода

//...............
Если ВыводитьQR Тогда
ТЗШапка.Очистить();
ТЗДляКода.Очистить();
ТЗСериализацияНоменклатуры.Очистить();

СтрокаТЗШапка = ТЗШапка.Добавить();
СтрокаТЗШапка.Клиент = ВыборкаЗаявка.Клиент.НаименованиеПолное;
СтрокаТЗШапка.NДок = ВыборкаЗаявка.Ссылка.Номер;
СтрокаТЗШапка.ДатаДок = Формат(ВыборкаЗаявка.Ссылка.Дата,"ДЛФ=D");
КонецЕсли;

// В цикле обхода табличной части документа
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Проверяем наличие номенклатуры в таблице сериализации. При отсутствии добавляем
Если ВыводитьQR Тогда
Если ТЗСериализацияНоменклатуры.Найти(Формат(Число(ВыборкаДетальныеЗаписи.Код),"ЧГ=0"),"Код")=Неопределено Тогда
НоваяСтрокаСериализации = ТЗСериализацияНоменклатуры.Добавить();
НоваяСтрокаСериализации.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура.Наименование;
НоваяСтрокаСериализации.Код = Формат(Число(ВыборкаДетальныеЗаписи.Код),"ЧГ=0");
КонецЕсли;

НоваяСтрока = ТЗДляКода.Добавить();
НоваяСтрока.Номенклатура = Формат(Число(ВыборкаДетальныеЗаписи.Код),"ЧГ=0");
НоваяСтрока.Характеристика1 = ВыборкаДетальныеЗаписи.Характеристика1; 
 НоваяСтрока.Характеристика2 = ВыборкаДетальныеЗаписи.Характеристика2; 
 КонецЕсли;

КонецЦикла;
// В конце табличного документа выводим QR Code
Если ВыводитьQR Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
ТЗВМассиве = Новый Массив;
ТЗВМассиве.Добавить(ТЗСериализацияНоменклатуры);
ТЗВМассиве.Добавить(ТЗДляКода);
ОбластьСКодом = ИнтересныеФишки.НапечататьКодСервер(ТЗШапка,ТЗВМассиве,,ТабДок,,,,"|");

КонецЕсли;

19 Comments

  1. Wanderer.nk

    Самый главный плюс этой обработки — возможность передачи любых документов в «электронном» виде на бумаге.

    У меня в компании на каждой ТТН, СФ, сопроводительном документе выводится такой код.

    Очень упрощает ввод документа в базу у контрагента.

    Reply
  2. mkostya

    Видно что огромная работа проделана, однозначно плюс. Пойду тестировать…

    Reply
  3. Wanderer.nk

    mkostya 🙂 Спасибо

    Вообще эта разработка была написана еще в апреле в зачаточном состоянии и запущена в работу в компании.

    Постепенно дорабатывалась и на Инфостарте выложил в июне в черновиках. 2 месяца накапливались изменения, решил опубликовать. Вроде мыслей по доработкам больше нет, может у вас появятся 🙂 Пишите, сделаем 🙂

    Reply
  4. Dimasik2007

    Вопрос очередной опять же к модератаром.

    Вот это «нафига»:

    Конфигурации: 1C: Предприятие 8, 1С:Комплексная автоматизация 8, 1С:Бухгалтерия 8, 1С:Зарплата и Управление Персоналом 8, 1С:Налогоплательщик 8, 1С:Платежные документы 8, 1С:Предприниматель 8, 1С:Управление торговлей 8, 1С:Зарплата и кадры бюджетного учреждения 8 , 1С:Свод отчетов 8, 1С:Консолидация 8 , 1С:Розница 8, 1С:Управление производственным предприятием 8, 1C:Управление небольшой фирмой, 1С:Бухгалтерия бюджетного учреждения 8, 1С:Бухгалтерия государственного учреждения 8

    Внешний отчет, обработка для 1С: Предприятие 8.2
    Reply
  5. Wanderer.nk

    (4) Dimasik2007, извиняюсь. Моя первая публикация. Исправлю.

    Reply
  6. 1cNike

    Генерируемый QR код не читается сканером. Сравнивал его с кодом полученным другой обработкой — они разные. Кодировалось одно и тоже слово. Куда копать?

    Reply
  7. 1cNike

    Разобрался. Оказывается сам виноват, в кодируемой строке был символ «№». Спасибо за публикацию

    Reply
  8. lcd

    http://v8.1c.ru/news/newsAbout.jsp?id=11184

    Новая возможность программ 1С — формирование платежных документов с QR-кодом

    Фирма «1С» реализовала поддержку нового стандарта на уровне «Библиотеки стандартных подсистем» 1С:Предприятия 8. Функция печати QR-кода предоставляется в рамках договора информационно-технологического сопровождения 1С:ИТС и может быть легко встроена в любое прикладное решение системы.

    Reply
  9. Wanderer.nk

    (8) lcd, Спасибо за информацию

    нужно проверить, как решение от 1С поведет себя на упаковке массивов данных и какой максимальный объем можно запихнуть в один QR код у 1С.

    Reply
  10. minimajack

    (9)

    QR-Code

    Максимальное количество символов, которые помещаются в один QR-код:

    цифры — 7089;

    цифры и буквы (латиница) — 4296;

    двоичный код — 2953 байт (следовательно, около 2953 букв кириллицы в кодировке windows-1251 или около 1450 букв кириллицы в utf-8);

    По факту уже при 1кб данных — адекватно считывать не получается

    один гуид = 128 бит = 16 байт — максимум 184 гуида; для платежки хватит — для упаковки массива идея бредовая

    Reply
  11. Wanderer.nk

    (10) minimajack, почему же бредовая?

    мое решение успешно работает с момента публикации (даже на пару месяцев больше).

    Мой предыдущий комментарий был к вопросу о технических ограничениях решения от 1С, а не стандарта. Про лимиты стандарта я в самой публикации указал в части кириллицы.

    Reply
  12. minimajack

    (11)

    а именно 4296 знаков при использовании кириллицы

    — это при использовании латиницы

    1С реализует стандарт оплаты по QR -коду, это совершенно не относится к упаковке массивов.

    Прочитать про стандарт

    Reply
  13. Wanderer.nk

    (12) minimajack, но в том числе 1С в БСП предоставляет механизмы по формированию и выводу QR кодов.

    В моем случае можно заменить используемые мной костыли с php на решение от 1С.

    Все остальное смысла менять нет.

    UPD: Посмотрел БСП 2.2.5 Да, компоненты и механизмы уже реализованы и встроены в БСП (не платформу).

    В демо примерах (да и в реальной жизни будет так же) QR код формируется конечно на основании кириллических данных.

    Да, кстати, в стандарте сказано (стр. 5)

    — алфавитно-цифровые данные: 4296 знаков;

    вот только какой именно алфавит используется в данном стандарте….

    Reply
  14. minimajack

    (13) я не знаю какой стандарт вы читаете, но тут спецификация -> QR code specification

    на 26 странице как раз и показан алфавит при alfanumeric сжатии, грубо говоря используется 6 бит вместо 8. Поэтому объем увеличивается.

    Для простого расчета лучше использовать raw данные двоичный код — 2953 байт. Ну и в зависимости от сжатия( кодировки) данных этот параметр плавает для самих данных (числа, числабуквы, утф8, канджи).

    Reply
  15. Wanderer.nk

    (14) minimajack, Я читал именно тот стандарт, который Вы привели в 12-ом сообщении.

    У меня ощущение, что мы с Вами говорим о разном.

    Еще раз:

    1. Я не скажу сейчас(!), сколько символов кириллицы влезает в QR код, который генерируется данным решением и затем считывается оборудованием клиента, поскольку я 2 года как покинул компанию, где это решение было реализовано. Знаю только, что оно работает.

    2. Откуда была взята информация о количестве символов (а именно 4296 знаков при использовании кириллицы) уточнить не смогу, просто не помню. Информацию в стандарте априори считаем правильной, если решение выполнено по стандарту. Поэтому если в стандарте сказано про 2953 символов кириллицы, принимаем это.

    3. Решение от 1С, о котором сказал lcd для меня в первую очередь интересно возможностью отказаться от php, а не печатью документов в УФЭБС

    Reply
  16. minimajack

    (15) возможно вам будет интересно альтернативное решение созданное на основе ком объекта JScript.

    Решение делалось как проверка возможностей jscript движка и является портом двух js библиотек QRCode и PNG.

    Reply
  17. Alien_job

    (16) minimajack, большое спасибо за обработку!

    Reply
  18. p-serg

    Павел, помогите понять: а мона вводить «первичку»: Торг-12, Счфак, сами счета, и приёмные акты из другой программы в 1С посредством QR -кода.

    При условии, конечно, что они уже несут на себе изображение QR ?

    Сергей

    Reply
  19. GreenDragon
    — Масштабирование области под размер кода, т.к. не всегда код влезает в область, а иногда размер области избыточен.

    Реализовано? у меня как раз сейчас стоит задача максимально вписать QR в этикетку, чтобы увеличить расстояние, на котором ТСД смогут «увидеть» и прочитать данные.

    Reply

Leave a Comment

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