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