Пять способов сформировать QR-код в 1С и напечатать его в документе
Содержание
QR-код в 1С 8.3 получают пятью путями: включить готовую печать на счёте (без единой строки кода), сгенерировать картинку через внешнюю компоненту и общий модуль ГенерацияШтрихкода из БСП, отдать код по ссылке через HTTP-сервис, вывести его в макет печатной формы или собрать в мобильном приложении. Выбор зависит от того, нужен вам платёжный QR на документе или произвольный код под свою задачу.
Если цель — дать покупателю оплатить счёт по камере телефона, программировать ничего не придётся: механизм уже встроен в типовые конфигурации. Если код должен нести произвольные данные (ссылку, серийный номер, маркировку, идентификатор), подключают компоненту и пишут несколько строк на встроенном языке. Разберём оба сценария по шагам и соберём код, который можно скопировать.
Короткий ориентир, какой способ под какую задачу:
| Способ | Когда выбирают | Нужен программист |
|---|---|---|
| Встроенная печать на счёте | Платёж по QR для покупателя | Нет |
Компонента и модуль ГенерацияШтрихкода | Произвольный код внутри 1С | Да |
| HTTP-сервис | Код нужен снаружи (сайт, письмо) | Да |
| Макет печатной формы | Код на бумажном бланке документа | Да |
| Мобильное приложение | Показать код на экране телефона | Да |
Когда QR-код уже встроен в типовую конфигурацию
В «1С:Бухгалтерии 8» и «Управлении нашей фирмой» QR-код на счёте покупателю формируется штатно — по ГОСТ Р 56042-2014. Клиент наводит камеру банковского приложения и получает заполненную платёжку: реквизиты подставляются из кода, руками ничего вводить не нужно.
Чтобы код появился, у организации должен быть заполнен банковский счёт (Главное → Организации → Банковские счета): БИК, расчётный и корреспондентский счета, наименование банка. Без них платёжный QR собрать не из чего.
Дальше откройте счёт покупателю и в команде печати выберите вариант печатной формы с QR-кодом (в списке вариантов он подписан отдельно). Код встанет в правый нижний угол бланка рядом с реквизитами.
Платёжный QR кодирует строку формата ST00012|Name=...|PersonalAcc=...|BankName=...|BIC=...|CorrespAcc=...|Sum=...|Purpose=.... Это и есть содержимое кода — тот самый текст, который «спрятан» в картинке. Сумма указывается в копейках.
В этой строке первые пять полей обязательны: наименование получателя (Name), расчётный счёт (PersonalAcc), банк (BankName), БИК (BIC) и корреспондентский счёт (CorrespAcc). Остальные — сумма (Sum), назначение платежа (Purpose), ИНН и КПП — необязательные: без суммы плательщик введёт её сам в приложении банка. Служебный префикс ST00012 сообщает приложению, что это платёжный код по российскому стандарту.
Такой код читает любое банковское приложение, поддерживающее СБП и платежи по QR. Никаких внешних компонент для этого ставить не нужно — всё работает «из коробки».
Тот же платёжный QR 1С умеет выводить и на платёжное поручение, а в кассовом чеке розницы QR-код печатает сама ККТ по требованиям 54-ФЗ — его в 1С рисовать не нужно, конфигурация лишь передаёт данные на фискальный регистратор.
Внешняя компонента печати штрихкодов и модуль «ГенерацияШтрихкода»
Для произвольного QR (ссылка, номер договора, данные для интеграции) используют native-компоненту печати штрихкодов. В поставку БСП она входит как общий макет, а оборачивает её общий модуль ГенерацияШтрихкода с функцией ИзображениеШтрихкода. Компонента кроссплатформенная — одинаково работает на сервере под Windows и Linux.
Минимальный код на сервере выглядит так:
&НаСервере
Функция СформироватьQR(Текст)
Параметры = Новый Структура;
Параметры.Вставить("Ширина", 200);
Параметры.Вставить("Высота", 200);
Параметры.Вставить("Штрихкод", Текст);
Параметры.Вставить("ТипКода", 99); // символика QR-кода
Результат = ГенерацияШтрихкода.ИзображениеШтрихкода(Параметры);
Если Результат.КодВставлен Тогда
Возврат Результат.Картинка;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Функция возвращает объект типа Картинка, который кладут в реквизит формы, макет или двоичные данные. Свойство КодВставлен показывает, поместился ли текст в заданный размер: если данных много, а размерность мелкая, код не влезет.
Значение ТипКода для QR задаётся по списку символик компоненты — в актуальных релизах БСП это 99. Перед правкой кода сверьтесь с описанием функции ИзображениеШтрихкода в вашей версии библиотеки.
Если конфигурация написана без БСП, компоненту подключают напрямую через ПодключитьВнешнююКомпоненту, а макет с файлом компоненты хранят в самой конфигурации. Логика та же: передаёте текст, тип символики и размер — получаете картинку.
У QR-кода есть встроенная коррекция ошибок: даже частично повреждённый или перекрытый код считывается. Чем выше уровень коррекции, тем надёжнее распознавание, но тем плотнее становится рисунок и тем крупнее его нужно печатать под тот же объём данных. Для кодов на документах, которые будут мяться или пачкаться, разумно заложить уровень повыше и не экономить на размере картинки.
Объём данных тоже влияет на плотность: чем длиннее строка, тем мельче отдельные модули кода при фиксированном размере. Для коротких ссылок и номеров достаточно квадрата 150–200 точек, для длинных строк размер увеличивают, иначе КодВставлен вернёт Ложь.
HTTP-сервис: получить QR-код по ссылке
Когда код нужен за пределами 1С — на сайте, в письме, в стороннем сервисе — удобно опубликовать HTTP-сервис, который возвращает готовую картинку по URL. Клиент (браузер, внешняя система) просто запрашивает адрес с параметром и получает PNG.
Обработчик метода GET отдаёт двоичные данные картинки:
Функция QRКодGET(Запрос)
Текст = Запрос.ПараметрыЗапроса.Получить("text");
Картинка = СформироватьQR(Текст);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "image/png");
Ответ.УстановитьТелоИзДвоичныхДанных(Картинка.ПолучитьДвоичныеДанные());
Возврат Ответ;
КонецФункции
Сервис публикуют на веб-сервере через Администрирование → Публикация на веб-сервере (в конфигураторе). После публикации QR доступен по адресу вида http://ваш-сервер/base/hs/qr/get?text=....
HTTP-сервис открывает доступ к базе извне. Ограничьте его отдельным пользователем с минимальными правами и закройте публикацию за обратным прокси с авторизацией — иначе любой, кто знает адрес, сможет дёргать вашу базу.
Вариант «наоборот» — когда 1С сама обращается к внешнему онлайн-генератору через HTTPСоединение — рабочий, но тянет зависимость от стороннего сервиса и уводит данные за периметр. Для платёжных и персональных данных так лучше не делать.
Как вывести QR-код в печатную форму документа
Чтобы код попал на бумажный бланк, его помещают в макет печатной формы. В макете СКД или табличного документа добавляют область с рисунком, тип рисунка — «Картинка из данных», и привязывают её к реквизиту, в который код подставляется при формировании.
Порядок действий в расширении конфигурации (чтобы не менять типовую):
- Создайте расширение и добавьте в него макет печатной формы нужного документа.
- В макете вставьте область
Рисунок, задайте размер под QR (квадрат, обычно от 30×30 мм). - В модуле формирования печати вызовите
СформироватьQR(...)и присвойте результат свойствуРисунок.Картинкаэтой области. - Соберите табличный документ и выведите на печать как обычную печатную форму.
Расширения конфигурации
появились в платформе 8.3.6 и позволяют добавить свою печать без снятия типовой с поддержки. После загрузки файла .cfe выполните «Обновить конфигурацию
базы данных» — это отдельный шаг, без него макет не заработает.
Размер картинки держите кратным модулю QR, иначе при печати код «замылится» и перестанет читаться. Для надёжного сканирования закладывайте запас по размеру и белое поле вокруг кода.
Генерация QR в мобильном приложении 1С
Мобильная платформа 1С поддерживает ту же компоненту печати штрихкодов, поэтому логика формирования не меняется: вызываете функцию, получаете Картинку и выводите её в реквизит формы с типом «Картинка». Код показывается прямо на экране телефона — например, пропуск, талон или ссылку на объект показывают партнёру для считывания.
Код на мобильном устройстве удобно собирать на стороне сервера и передавать на клиент готовой картинкой: так не зависишь от того, доступна ли компонента на конкретной модели устройства. Если приложение должно работать без связи, картинку формируют заранее и хранят в базе устройства — тогда код покажется даже офлайн, в поле или на складе без интернета.
На экране телефона QR выводят в поле формы с типом «Картинка». Размер поля задавайте с запасом: на мелком экране слишком плотный код камера соседнего устройства считает не с первого раза.
Не путайте генерацию со сканированием. Считывание чужого QR камерой — это отдельный механизм мобильной платформы (объект сканера штрихкодов), он решает обратную задачу: не рисует код, а распознаёт. Для приёмки товара, маркировки и ЕГАИС нужен именно сканер, а не генератор.
Массовая генерация QR-кодов в документах
Когда коды нужны пачкой — на партию товара, список билетов, реестр пропусков — генерацию ставят в цикл. Перебираете строки таблицы или выборку документов и для каждой вызываете функцию формирования:
Для Каждого Строка Из Товары Цикл
Строка.КартинкаQR = СформироватьQR(Строка.КодМаркировки);
КонецЦикла;
Полученные картинки складывают в реквизиты, присоединённые файлы или сразу в табличный документ для печати листами. Для крупных партий тяжёлую генерацию выносят в фоновое задание, чтобы не держать сеанс пользователя: сотни кодов в одном потоке считаются ощутимое время.
Если коды формируются регулярно по расписанию (ночная выгрузка, автоматическая рассылка), их собирает регламентное задание на сервере. Картинку в этом случае сохраняют во внешний файл через ПолучитьДвоичныеДанные() или кладут в присоединённый файл объекта.
Для печати листами удобно собрать коды партии в один табличный документ: на каждую строку — своя область с картинкой и подписью (артикул, номер, наименование). Так пачку этикеток с QR печатают одним заданием, а не по одному документу. Если коды идентифицируют физические объекты (товар, оборудование, пропуск), сохраняйте связь «код → объект» в самой базе, чтобы при сканировании можно было вернуться к исходной записи.
Почему QR-код не формируется или не читается
Чаще всего проблема не в коде, а в данных или окружении. Сопоставьте симптом с причиной.
Отдельно про платёжный код: если банковское приложение открывает платёж, но с пустыми полями, проверьте строку формата ST00012 — ошибка в разделителях | или в названиях полей ломает разбор на стороне банка.
Частые вопросы
Нужна ли отдельная лицензия или покупка компоненты для QR?
Можно ли сделать цветной QR или с логотипом посередине?
Работает ли генерация на сервере под Linux?
Какой максимум данных помещается в один QR-код?
Чем отличается генерация от сканирования QR в 1С?
Источники
- ГОСТ Р 56042-2014 «Стандарты финансовых операций. Двумерные символы штрихкода для осуществления платежей физических лиц»