Понадобилось выводить на печатную форму QR-код в 1С:Бухгалтерии 2.0 для квитанций, чтобы люди могли в Сбербанке эти квитанции оплачивать.
В Сбербанке формат строки, закодированной в QR, взяли не с потолка, формат данной строки регламентируется "Стандартами финансовых операций" — ГОСТ Р 56042-2014. Почитать можно тут.
Но, к моему величайшему сожалению, я не нашел простого и удобного способа это реализовать.
Гугление дало следующие варианты:
- с помощью компоненты "1С Печать Штрих-кодов" QR коды выводить нельзя, как и с помощью ActiveBarcode v3.5 - к тому же она не free :(
- есть вариант (подсказан на infostart) с помощью API товарищей из Google, но: во-первых, зачем себе создавать зависимость от интернета для печати штрих-кодов, а, во-вторых, некрасиво это как-то. Я уж молчу про то, что в один прекрасный момент Google может изменить свой API. Плюс нужно морочиться с сохранением картинки в файл, что мне тоже не нравится;
- есть платные варианты. Не хочу;
- есть предложения поднять свой веб-сервер. Веб-сервер, для печати штрихкодов? Неужели, настолько всё сложно?
- использовать библиотеку zint для генерации файла с QR кодом. Не совсем удобно, хотя как вариант;
- наконец-то, нашел Ocvita Barcode ActiveX!!! Справедливости рад, стоит сказать о том, что эта компонента создана на основе библиотеки zint, но ребята вне всякого сомнения молодцы!
Скачиваем, устанавливаем.
Вставляем в макет "Таблица" - "Рисунки" - "Вставить объект" - "Элемент управления" - "Ocvita Barcode". Называем этот объект именем Штрихкод.
Процедура Печать()
Т = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
Макет.Рисунки.Штрихкод.Объект.symbology = 58; // тип = QR
Макет.Рисунки.Штрихкод.Объект.barcode = ВернутьСтрокуДляКодирования();
Т.Вывести(Макет);
Т.ТолькоПросмотр = Истина;
Т.Показать();
КонецПроцедуры
// Опишем вспомогательную функцию для преобразования в UTF8
Функция UTF8(Ст)
НоваяСт = "";
Для i=1 по СтрДлина(Ст) Цикл
Символ = Сред(Ст,i,1);
КодСимвола = КодСимвола(Символ);
Если (КодСимвола > 191) и (КодСимвола < 224) Тогда// А - Я
НоваяСт = НоваяСт + Символ(208)+Символ(КодСимвола-48);
ИначеЕсли (КодСимвола > 223) и (КодСимвола < 240) Тогда// а - п
НоваяСт = НоваяСт + Символ(208)+Символ(КодСимвола-48);
ИначеЕсли (КодСимвола > 239) и (КодСимвола < 256) Тогда// р - я
НоваяСт = НоваяСт + Символ(209)+Символ(КодСимвола-112);
ИначеЕсли (Символ = "ё") или (Символ = "Ё") Тогда
НоваяСт = НоваяСт + Символ(208)+Символ(КодСимвола-39);
ИначеЕсли (Символ = "№") Тогда
НоваяСт = НоваяСт + Символ(226)+Символ(132)+Символ(150);
Иначе
НоваяСт = НоваяСт + Символ;
КонецЕсли;
КонецЦикла;
Возврат НоваяСт;
КонецФункции
//Текст для кодирования выглядит примерно так
Функция ВернутьСтрокуДляКодирования()
SFormat = "ST";
CodeVersion = "0001";
Символ_ = "|";
CodePage = 2; //UTF
Name = "Name=" + НашаФирма;
PersonalAcc ="PersonalAcc=" + НашРасчетныйСчет;
BankName = "BankName=" + НазваниеНашегоБанка;
BIC = "BIC=" + БИК;
CorrespAcc = "CorrespAcc=" + КорСчет;
Sum = "Sum=" + СуммаВКопейках; //в копейках, т.е не 100,52, а 10052
PayeeINN = "PayeeINN=" + НашИНН;
LastName = "LastName=" + ФамилияПлательшика;
FirstName = "FirstName=" + ИмяПлательщика;
MiddleName = "MiddleName=" + ОтчествоПлательщика;
payerAddress ="payerAddress=" + АдресПлательщика;
PersAcc = "PersAcc="+ НомерДоговораСПлательщиком;
PaymPeriod = "PaymPeriod="+РасчПериод // расчетный период вида ММГГ;
Рез = SFormat + CodeVersion + CodePage + Символ_ +
Name + Символ_ +
PersonalAcc + Символ_ +
BankName + Символ_ +
BIC + Символ_ +
CorrespAcc + Символ_ +
Sum + Символ_ +
PayeeINN + Символ_ +
LastName + Символ_ +
FirstName + Символ_ +
MiddleName + Символ_ +
payerAddress + Символ_ +
PersAcc + Символ_ +
PaymPeriod;
Возврат UTF8(Рез);
КонецФункции
Кстати, можно будет проверить QR-код для квитанции Сбербанка - правильно или нет он сгенерирован - с помощью сайта http://sbqr.ru/validator/index.html
P.S.: Если кто-то знает способ проще - прошу в комменты!