QR код может иметь около 30% зон заполненной случайной информацией - эти 30% нам и нужны. Согласно википедии: «Исправляется до 30% повреждений (фиксированные уровни в 7, 15, 25 и 30 процентов)» и телефон всё равно сможет раскодировать информацию. Таким образом QR коду возможно придавать любую форму и цвет.
Стартовой точкой послужил этот ресурс
Для формирования текста использовалась код из публикации: //infostart.ru/public/80106/, с исправлением некоторых недочетов.
Порядок действий:
- Генерируем текст, который надо прописать в QR-коде;
- Используем ссылку «http://chart.apis.google.com/chart?cht=qr&chs=308×308&chl=» +»Наш текст»;
- Скачиваем картинку (стандартным 1С способом без использования внешней компоненты);
- С помощью программы IrfanView редактируем картинку и наносим watermark (в автоматическом режиме);
- Размещаем картинку (в данной статье РисунокТабличногоДокумента).
Код реализации:
filename = СоздатьQR_Code_Чек("тут данные");
Если НЕ filename = Неопределено Тогда
ОбластьQR_Code.Рисунки.D1.Картинка = Новый Картинка(filename);
ТабличныйДокумент.Вывести(ОбластьQR_Code);
УдалитьФайлы(filename);
КонецЕсли;
Функция СоздатьQR_Code_Чек(Соответствие) Export
Строка = "QR код с логотипом" + Символы.ПС;
Data = EncodeURL(Строка);
filename = СоздатьQR_Code(Data);
Если НЕ filename = Неопределено Тогда
Ком = Новый COMObject("wScript.Shell");
Ком.Run("cmd /c start /wait c:\IrfanView\i_view32.exe " + filename + " /crop=(17,17,270,270) /advancedbatch /aspectratio /resample /silent /convert=" + filename, , Истина);
КонецЕсли;
Возврат filename;
КонецФункции
Функция СоздатьQR_Code(Data) Export
Возврат ПолучитьКартинкуПоHTTPСсылке("chart.apis.google.com", "chart?cht=qr&chs=308x308&chl=" + Data);
КонецФункции
Функция ПолучитьКартинкуПоHTTPСсылке(Server, Ref) Export
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("png");
Попытка
Соединение = Новый HTTPСоединение(Server);
Соединение.Получить(Ref, ИмяВременногоФайла);
Возврат ИмяВременногоФайла;
Исключение
Возврат Неопределено;
КонецПопытки;
КонецФункции
Функция КонвертироватьСтрокуHEX(Значение) Export
Значение = Число(Значение);
Если Значение <= 0 Тогда
Результат = "0";
Иначе
Значение = Цел(Значение);
Результат = "";
Пока Значение > 0 Цикл
Результат = Сред("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", Значение % 16 + 1, 1) + Результат;
Значение = Цел(Значение / 16);
КонецЦикла;
КонецЕсли;
Если СтрДлина(Результат) < 2 Тогда
Результат = "0" + Результат;
КонецЕсли;
Возврат "%" + Результат;
КонецФункции
Функция EncodeURL(URL) Export
Рез = "";
Для Сч = 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
Рез = Рез + КонвертироватьСтрокуHEX(192 + Цел(vch / 64));
Рез = Рез + КонвертироватьСтрокуHEX(128 + (vch % 64));
Иначе // 0x7FF < ch
Рез = Рез + КонвертироватьСтрокуHEX(224 + Цел(vch / 4096));
Рез = Рез + КонвертироватьСтрокуHEX(128 + (Цел(vch / 64) % 64));
Рез = Рез + КонвертироватьСтрокуHEX(128 + (vch % 64));
КонецЕсли;
КонецЦикла;
Возврат Рез;
КонецФункции
Разберем строчку кода:
Ком.Run("cmd /c start /wait c:\IrfanView\i_view32.exe " + filename + " /crop=(17,17,270,270) /advancedbatch /aspectratio /resample /silent /convert=" + filename, , Истина);
- "cmd" - запуск командной строки.
- "/c" - дождаться завершения работы команд и завершить сеанс cmd
- "start /wait" - дает нам возможность запустить приложение и ждать его завершения
- "/crop=(17,17,270,270)" - обрезать часть изображение по заданным параметрам (x, y, widht, height)
- "/advancedbatch" - использовать продвинутые опции
- "/aspectratio" - сохранять пропорции изображения
- "/resample" - минимизировать потери качества
- "/silent" - не выводить сообщения про ошибки и предупреждения
- "/convert=" - конвертировать и записать в файл с именем
И сам watermark, нужно запустить IrfanView и произвести настройки:
После настройки сохраните: "Save settings"
Для работы выбирайте логотип, который будет занимать не более 30% QR-кода, так же для повышения читаемости используйте прозрачность, в этом примере логотип занимает не более 15%. Удачных Вам свершений.
UPD: Irfanview сохраняет настройки для каждого пользователя отдельно. (вот здесь: C:\Users\ИмяПользователя\AppData\Roaming\IrfanView). Если вы используете файловый вариант базы, для каждого пользователя нужно скопировать настройки IrfanView в эту папку. Если же это серверный вариант - достаточно скопировать настройку пользователю от которого запущена служба 1С.