Вывод QR-кода типовыми средствами.



Вывод QR-кода типовыми средствами.
На данный момент очень часто нужно вывести в печатную форму QR-код.
Показываю как на примере типового кода из УТ11 это сделать.
Можно использовать в любых конфигурациях с обычными формами.

На данный момент очень часто нужно вывести в печатную форму QR-код.
Показываю как на примере типового кода из УТ11 это сделать.

 

Шаг 1
Для этого нужно скопировать из УТ11 ОбщийМакет.КомпонентаПечатиQRКода.

Я брал из УТ 11.4

Если по каким то причинам не можете скопировать макет из УТ, то данный макет прилагаю ниже в обработке "КомпонентаПечатиQRКода.epf".

Так же в обработке ""КомпонентаПечатиQRКода.epf" есть кнопка "Пример печати".

Шаг 2

Скопировать себе в модуль 5 процедур:

/////////////////////////////////////////////////////////////////////////////
// Вывод QR-кода


Функция КомпонентаФормированияQRКода()

ТекстОшибки = НСтр("ru = 'Не удалось подключить внешнюю компоненту для генерации QR-кода. Подробности в журнале регистрации.'");

QRCodeGenerator = ПодключитьКомпонентуИзМакета("QRCodeExtension", "ОбщийМакет.КомпонентаПечатиQRКода");
Если QRCodeGenerator = Неопределено Тогда
#Если Клиент Тогда
Сообщить(ТекстОшибки);
#КонецЕсли
КонецЕсли;

Возврат QRCodeGenerator;

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

Функция ПодключитьКомпонентуИзМакета(Идентификатор, ПолноеИмяМакета) Экспорт

ПодключаемыйМодуль = Неопределено;

Местоположение = ПолноеИмяМакета;
СимволическоеИмя = Идентификатор + "SymbolicName";

Если ПодключитьВнешнююКомпоненту(Местоположение, СимволическоеИмя) Тогда

Попытка
ПодключаемыйМодуль = Новый("AddIn." + СимволическоеИмя + "." + Идентификатор);
Если ПодключаемыйМодуль = Неопределено Тогда
ВызватьИсключение НСтр("ru = 'Оператор Новый вернул Неопределено'");
КонецЕсли;
Исключение
ПодключаемыйМодуль = Неопределено;
ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;

Если ПодключаемыйМодуль = Неопределено Тогда

ТекстОшибки = НСтр("ru = 'Не удалось создать объект внешней компоненты ""%1"", подключенной на сервере
|из макета ""%2"",
|по причине:
|%3'");

ЗаписьЖурналаРегистрации(
НСтр("ru = 'Подключение внешней компоненты на сервере'",
КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка,,,
ТекстОшибки);

КонецЕсли;

Иначе

ТекстОшибки = НСтр("ru = 'Не удалось подключить внешнюю компоненту ""%1"" на сервере
|из макета ""%2""
|по причине:
|Метод ПодключитьВнешнююКомпоненту вернул Ложь.'");

ЗаписьЖурналаРегистрации(
НСтр("ru = 'Подключение внешней компоненты на сервере'",
КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка,,,
ТекстОшибки);

КонецЕсли;

Возврат ПодключаемыйМодуль;

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

Функция КодОсновногоЯзыка() Экспорт

Возврат Метаданные.ОсновнойЯзык.КодЯзыка;

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

// Возвращает двоичные данные для формирования QR-кода.
//
// Параметры:
//  QRСтрока         - Строка - данные, которые необходимо разместить в QR-коде.
//
//  УровеньКоррекции - Число - уровень погрешности изображения, при котором данный QR-код все еще возможно 100 %
//                             распознать.
//                     Параметр должен иметь тип целого и принимать одно из 4 допустимых значений:
//                     0 (7 % погрешности), 1 (15 % погрешности), 2(25 % погрешности), 3(35 % погрешности).
//
//  Размер           - Число - определяет длину стороны выходного изображения в пикселях.
//                     Если минимально возможный размер изображения больше этого параметра - код сформирован не будет.
//
// Возвращаемое значение:
//  ДвоичныеДанные  - буфер, содержащий байты PNG-изображения QR-кода.
//
// Пример:
//
//  // Выводим на печать QR-код, содержащий в себе информацию зашифрованную по УФЭБС.
//
//  QRСтрока = УправлениеПечатью.ФорматнаяСтрокаУФЭБС(РеквизитыПлатежа);
//  ТекстОшибки = "";
//  ДанныеQRКода = УправлениеПечатью.ДанныеQRКода(QRСтрока, 0, 190, ТекстОшибки);
//  Если Не ПустаяСтрока(ТекстОшибки)
//      ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
//  КонецЕсли;
//
//  КартинкаQRКода = Новый Картинка(ДанныеQRКода);
//  ОбластьМакета.Рисунки.QRКод.Картинка = КартинкаQRКода;
//
Функция ДанныеQRКода(QRСтрока, УровеньКоррекции, Размер) Экспорт

//УстановитьОтключениеБезопасногоРежима(Истина);
ГенераторQRКода = КомпонентаФормированияQRКода();
Если ГенераторQRКода = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;

Попытка
ДвоичныеДанныеКартинки = ГенераторQRКода.GenerateQRCode(QRСтрока, УровеньКоррекции, Размер);
Исключение
ЗаписьЖурналаРегистрации(НСтр("ru = 'Формирование QR-кода'", КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

Возврат ДвоичныеДанныеКартинки;

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

Процедура ВывестиQRКод(ДанныеПечати, ОбластьМакета)

QRСтрока = ДанныеПечати;

Если Не ПустаяСтрока(QRСтрока) Тогда

ДанныеQRКода = ДанныеQRКода(QRСтрока, 0, 190);

Если ТипЗнч(ДанныеQRКода) = Тип("ДвоичныеДанные") Тогда
КартинкаQRКода = Новый Картинка(ДанныеQRКода);
ОбластьМакета.Рисунки["QRКод"].Картинка = КартинкаQRКода;
Иначе
ТекстСообщения = "Не удалось сформировать QR-код для документа";
#Если Клиент Тогда
Сообщить(ТекстСообщения);
#КонецЕсли
КонецЕсли;

КонецЕсли;

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


// Вывод QR-кода
/////////////////////////////////////////////////////////////////////////////

 

Шаг 3

В макет, в котором вам нужен QR-код вставляете пустую картинку и называете ее QRКод (название может быть любым, но в примере кода используется это название).

 

Шаг 4

Печатаете QR-код

Процедура КнопкаПечатьНажатие(Кнопка)

ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("ВыводQR");



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

ТекстСсылки = "dobromir.kz"; //Ваша ссылка, можно передавать все что хотите
ВывестиQRКод(ТекстСсылки ,ОблQRКод);
ТабДок.Вывести(ОблQRКод);

ТабДок.Показать();

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

Пример области макета:

Пример результата работы:

Итог

Обработка "КомпонентаПечатиQRКода.epf" идет в качестве примера, так же в ней есть макет "КомпонентаПечатиQRКода".

Все что написано, можно реализовать самостоятельно, описания выше достаточно.

 

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

Тестировалась на:

Конфигурации для Казахстана

Зарплата и Управление Персоналом для Казахстана, редакция 2.0, разработка для Казахстана: «1С-Рейтинг» (2.0.17.7)

"Управление торговлей для Казахстана", редакция 2.2,  локализация для Казахстана: "1С-Рейтинг",  "1С-Сапа" (2.2.17.4)

Бухгалтерия для Казахстана, редакция 2.0, разработка для Казахстана: «1С-Рейтинг» (2.0.29.3)

Управление торговым предприятием для Казахстана, редакция 2.0, разработка для Казахстана: «1С-Рейтинг» (2.0.18.1)

Для РФ

"Управление торговлей", редакция 10.3 (10.3.48.2) 

Управление производственным предприятием, редакция 1.3 (1.3.113.4)

 

13 Comments

  1. rusmm93

    Какое максимальное количество символов можно зашифровать в QR-коде таким образом?

    Reply
  2. Senator_I

    А компонента эта в платформу вшита? Не так как с штрихкодами?

    Reply
  3. Емельянов Алексей

    (1) Не нашел такой информации, мне для работы сейчас хватает 100-200 символов, судя по QR-коду еще много войдет.

    Reply
  4. Емельянов Алексей

    (2) Да вшита в УТ11, можете оттуда взять.

    Reply
  5. Емельянов Алексей

    (2) Мне тем этот метод и понравился. Что нужно всего 5 процедур и компонента, все в платформе, никуда обращаться не нужно.

    А то нужно было в фискальный чек QR-код вывести, что только не предлагают и dll и java-скрипты и онлайн сервисы.

    Хорошо люди подсказали взять из типовой, я вот оттуда все и собрал в свою конфигурацию.

    Reply
  6. dandykry
    ДанныеQRКода = УправлениеПечатью.ДанныеQRКода(Штрихкод, 2, 100);
    
    Если ТипЗнч(ДанныеQRКода) = Тип(«ДвоичныеДанные») Тогда
    КартинкаQRКода = Новый Картинка(ДанныеQRКода);
    ОбластьМакета.Рисунки.КартинкаШтрихкода.Картинка= КартинкаQRКода;
    КонецЕсли;
    Reply
  7. dandykry
    Эталон = Обработки.ПечатьЭтикетокИЦенников.ПолучитьМакет(«Эталон»);
    КоличествоМиллиметровВПикселе = Эталон.Рисунки.Квадрат100Пикселей.Высота / 100;
    
    ПараметрыШтрихкода = Новый Структура;
    ПараметрыШтрихкода.Вставить(«Ширина»,          Окр(ОбластьМакета.Рисунки.КартинкаШтрихкода.Ширина / КоличествоМиллиметровВПикселе));
    ПараметрыШтрихкода.Вставить(«Высота»,          Окр(ОбластьМакета.Рисунки.КартинкаШтрихкода.Высота / КоличествоМиллиметровВПикселе));
    ПараметрыШтрихкода.Вставить(«Штрихкод»,        Штрихкод);
    ПараметрыШтрихкода.Вставить(«ТипКода»,         16); // QR
    ПараметрыШтрихкода.Вставить(«ОтображатьТекст», Ложь);
    ПараметрыШтрихкода.Вставить(«РазмерШрифта»,    6);
    
    ОбластьМакета.Рисунки.КартинкаШтрихкода.Картинка = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);
    

    Показать

    Reply
  8. Емельянов Алексей

    (7) Это доя какой конфигурации код?

    Reply
  9. dandykry

    (8) ДанныеQRКода из БСП

    МенеджерОборудованияВызовСервера — скорее всего из БПО. Вообще скопировал из ЕРП, но думаю в большинстве конфигураций с БСП + БПО или по отдельности хотя бы 1 из них. (Типовых не знаю таких, только старые)

    UP:

    http://prntscr.com/pmmxbe

    https://its.1c.ru/db/bsp311doc#content:1358:hdoc

    http://prntscr.com/pmmxwd

    https://its.1c.ru/db/metod8dev#content:5963:hdoc

    Reply
  10. dandykry

    (8) Если грубенько, то вы просто скопировали типовой код. Это наверное полезно для старых и самописных конфигураций. Для свежих типовых столько кода копировать бессмысленно.

    Когда я пытался в прошлый раз выложить на инфостарт разработку с использованием материалов типовых конфигураций и материалов с ИТС, меня послали. (сказали нельзя выкладывать консоль запросов с диска ИТС, хоть она у вас и дописана)

    Вас почему-то нет) А у вас и код, и компонента. Я не против, но удивляет политика ресурса.

    Reply
  11. Емельянов Алексей

    (10) Понятно, что те у кого новые УТ11 или ЕРП им не нужно.

    Но полно людей которые работают на УТ10 и других старых конфигурациях, там этого нет.

    Когда я выкладывал данную работу, я помнил правило о котором вы упомянули.

    Я понимаю почему так, если бы каждый выложил свою консоль запросов, тут бы все было в этих конослях. Я тоже свою консоль запросов под себя написал.

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

    Reply
  12. dandykry

    (11) Я не осуждаю. Хороший полноценный код. Я просто привел примеры, как это сделать в БСП в 2х вариантах. 1 из них у вас в разобранном виде в публикации.

    По поводу правила — я удивлен, что некоторые публикации заворачивают по причине того, что нарушаются правила, а некоторые нет. Лично мне без разницы. Логика модерации непонятна.

    2.1.1. Вы должны иметь право на публикацию материала, то есть, являться автором, обладателем исключительных прав на произведение или иметь разрешение на публикацию.
    2.2.5. Запрещается размещать материалы с диска ИТС фирмы “1С”.
    Reply
  13. AlxNel

    Спасибо!

    Reply

Leave a Comment

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