QR-код в печатной форме 1С 8.3: от строки данных до картинки на бланке
Содержание
Чтобы вставить QR-код в 1С 8.3, нужны три вещи: строка, которую вы кодируете, генератор картинки и место под неё в макете. В типовых конфигурациях на БСП генератор уже есть — это общий модуль ГенерацияШтрихкода, функция ИзображениеШтрихкода(). Готовую картинку кладут в объект «Рисунок» в макете печатной формы, и QR печатается вместе с документом.
Частое заблуждение — что для генерации QR-кодов нужно покупать стороннюю компоненту или ходить в интернет. Нет: в большинстве современных конфигураций всё работает «из коробки», внешние сервисы нужны только в нестандартных случаях. Ниже — все рабочие способы, код и разбор ошибок.
Что уже умеют платформа и типовые конфигурации
Сама платформа 1С:Предприятие 8.3 не содержит отдельного объекта «QR-код» для печати. Картинку рисует внешняя компонента печати штрихкодов. В типовых конфигурациях она лежит в общем макете, а вызывает её подсистема БСП «Генерация штрихкода».
Как проверить, что механизм есть в вашей базе:
- Откройте Конфигуратор:
Конфигурация → Открыть конфигурацию. - В дереве раскройте
Общие → Общие модули. - Найдите модуль
ГенерацияШтрихкода(удобно через поиск по дереву,Ctrl+F).
Если модуль на месте, у вас есть всё для генерации QR-кода без доработки платформы. Он есть в актуальных релизах Бухгалтерии 3.0, ЗУП 3.1, УТ 11 и других конфигурациях на свежей БСП.
Что можно получить без программирования:
- 🧾 В части типовых печатных форм QR-код уже выводится — например, платёжный QR в счёте на оплату. Посмотрите настройки печати нужного документа в вашей конфигурации.
- 🏷️ Этикетки и ценники с двумерными кодами настраивают через встроенный редактор шаблонов этикеток, если он есть в конфигурации (УТ, Розница, КА).
- 🔢 Коды маркировки (DataMatrix) печатаются штатными механизмами — это другой тип двумерного кода, не QR.
Если нужного QR в стандартной форме нет, остаются доработки. Их и разбираем дальше.
Генерация QR-кода средствами БСП
Самый надёжный путь в типовой конфигурации — вызвать ГенерацияШтрихкода. Модуль сам подключит компоненту, учтёт операционную систему сервера и вернёт готовую картинку.
&НаСервере
Функция КартинкаQRКода(ТекстДляКодирования)
ПараметрыШтрихкода = ГенерацияШтрихкода.ПараметрыГенерацииШтрихкода();
ПараметрыШтрихкода.Ширина = 300;
ПараметрыШтрихкода.Высота = 300;
ПараметрыШтрихкода.ТипКода = 16; // 16 = QR
ПараметрыШтрихкода.ОтображатьТекст = Ложь;
ПараметрыШтрихкода.Штрихкод = ТекстДляКодирования;
Результат = ГенерацияШтрихкода.ИзображениеШтрихкода(ПараметрыШтрихкода);
Если Не Результат.Результат Тогда
ВызватьИсключение "Не удалось сформировать QR-код";
КонецЕсли;
Возврат Результат.Картинка;
КонецФункции
Функция возвращает объект типа Картинка. Его можно сразу поставить в рисунок табличного документа, в поле формы или сохранить в файл через Картинка.Записать().
Полный набор параметров (уровень коррекции ошибок QR, поворот, шрифт подписи) зависит от версии БСП. Откройте в модуле функцию ПараметрыГенерацииШтрихкода() — там видны все поля структуры с комментариями.
Пара практических настроек:
- 📐 Размер. Генерируйте картинку с запасом, 300×300 точек и больше. В макете её потом уменьшают — так код на печати остаётся чётким.
- 🔤 Подпись под кодом. Для QR её обычно отключают (
ОтображатьТекст = Ложь): человеку длинная строка ни о чём не скажет. - 🗂️ Пакетная печать. Если в одном комплекте 50 документов с одинаковым QR (например, ссылка на сайт компании), сгенерируйте картинку один раз до цикла и подставляйте её в каждую область. Генерация на каждый документ заметно замедляет печать большого комплекта.
- ⚙️ Где вызывать. Печатные формы в типовых конфигурациях собираются на сервере, поэтому функцию вызывайте в серверном контексте.
Внешняя компонента: когда БСП нет или она старая
В самописных и старых конфигурациях модуля ГенерацияШтрихкода нет. Тогда компоненту печати штрихкодов подключают напрямую.
Порядок такой:
- Возьмите компоненту из любой типовой конфигурации: общий макет с компонентой печати штрихкодов (найдите в
Общие → Общие макетыпо слову «Штрихкод»). - Скопируйте макет в свою конфигурацию — лучше через расширение, если конфигурация на поддержке.
- Подключите компоненту методом
ПодключитьВнешнююКомпоненту()с указанием пути к макету и типаТипВнешнейКомпоненты.Native. - Создайте объект компоненты через
Новый("AddIn.<Имя>.<Объект>"), задайте свойства (тип кода, размеры, значение) и получите картинку.
Точные имена свойств компоненты зависят от её версии. Самый быстрый способ их узнать — посмотреть, как к компоненте обращается модуль ГенерацияШтрихкода в свежей типовой конфигурации. Этот код можно взять за образец.
Сравнение вариантов:
| Способ | Когда подходит | Риски |
|---|---|---|
Модуль ГенерацияШтрихкода (БСП) | Типовые конфигурации на актуальной БСП | Почти нет: обновляется вместе с конфигурацией |
| Компонента напрямую | Самописные базы, старая БСП | Свой код подключения, следить за версией компоненты |
| Сторонние компоненты | Нужны особые форматы или оформление | Лицензия, совместимость с Linux и веб-клиентом |
| HTTP-сервис | Нет компоненты, есть интернет | Данные уходят третьей стороне, зависимость от сети |
Компонента должна работать там, где выполняется код. Если сервер 1С на Linux, а вы взяли компоненту только под Windows, генерация упадёт на сервере, хотя у разработчика в файловой базе всё работало.
Как поставить QR-код в макет печатной формы
Картинку мало получить — её нужно вывести в нужное место бланка. Для этого в макете делают рисунок-заглушку.
Подготовка макета
- Откройте макет печатной формы в Конфигураторе (или в расширении, если форма типовая).
- Выделите ячейки, где должен стоять код.
- Вставьте рисунок через меню
Таблица → Рисунки → Картинка. - В палитре свойств рисунка задайте Имя, например
QRКод. - Свойство Размер картинки установите в «Пропорционально». Иначе квадратный код растянется и перестанет читаться.
- Поставьте рисунок внутрь именованной области (например,
Шапка), чтобы он попадал в вывод вместе с ней.
Заполнение при печати
В процедуре формирования печатной формы после получения области присвойте картинку рисунку:
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Рисунки.QRКод.Картинка = КартинкаQRКода(СтрокаДляQR);
ТабДок.Вывести(ОбластьШапка);
Обращение идёт по имени рисунка из палитры свойств. Если имя другое, получите ошибку обращения к несуществующему элементу коллекции.
Типовую печатную форму не правьте в основной конфигурации. Добавьте рисунок в макет и код вывода через расширение конфигурации — тогда обновления не затрут доработку, и не придётся снимать конфигурацию с поддержки.
Внешняя печатная форма с QR-кодом
Если доступа к Конфигуратору нет или не хочется трогать конфигурацию, делают внешнюю печатную форму. Она подключается в пользовательском режиме.
Что нужно в обработке:
- 📄 макет с рисунком
QRКод, подготовленный так же, как выше; - 🔧 экспортная функция
СведенияОВнешнейОбработке()— сообщает БСП вид обработки («Печатная форма») и документы, к которым она относится; - 🖨️ экспортная процедура
Печать()— формирует табличный документ, вызываетГенерацияШтрихкодаи заполняет рисунок.
Подключение в Бухгалтерии 3.0, ЗУП 3.1, УТ 11:
Администрирование → Печатные формы, отчеты и обработки.- Включите флажок «Дополнительные отчеты и обработки», если он снят.
- Откройте список «Дополнительные отчеты и обработки» и добавьте файл
.epf. - На закладке размещения укажите документы, в меню печати которых появится форма.
- Запишите карточку и проверьте печать из документа.
Внешняя обработка выполняется в контексте конфигурации, поэтому вызов ГенерацияШтрихкода из неё работает так же, как из встроенного кода.
Генерация через HTTP-сервисы и API
Когда компоненты нет совсем (например, в очень старой самописной базе), картинку можно получить у онлайн-генератора. Один из известных бесплатных — api.qrserver.com: он принимает текст в параметре data и возвращает PNG.
&НаСервере
Функция КартинкаQRЧерезСервис(Текст)
Адрес = "/v1/create-qr-code/?size=300x300&data="
+ КодироватьСтроку(Текст, СпособКодированияСтроки.КодировкаURL);
Соединение = Новый HTTPСоединение("api.qrserver.com", 443, , , , 30,
Новый ЗащищенноеСоединениеOpenSSL);
Ответ = Соединение.Получить(Новый HTTPЗапрос(Адрес));
Если Ответ.КодСостояния <> 200 Тогда
ВызватьИсключение "Сервис вернул код " + Формат(Ответ.КодСостояния, "ЧГ=0");
КонецЕсли;
Возврат Новый Картинка(Ответ.ПолучитьТелоКакДвоичныеДанные());
КонецФункции
Ограничения у такого подхода серьёзные:
- 🔒 Текст QR-кода уходит на чужой сервер. Не отправляйте так платёжные реквизиты, персональные данные и коды маркировки.
- 🌐 Нет интернета на сервере 1С — нет и печати.
- ⏱️ Каждый документ — сетевой запрос. Пакетная печать сотни счетов заметно замедлится.
Корректный вариант того же подхода — свой сервис генерации внутри сети компании. 1С обращается к нему так же через HTTPСоединение, а данные не покидают периметр.
Обратное направление тоже встречается: 1С публикует свой HTTP-сервис, а внешняя система (сайт, мобильное приложение) запрашивает у него готовую картинку. Внутри обработчика используется та же функция КартинкаQRКода(), а ответ отдают двоичными данными с заголовком Content-Type: image/png.
Что зашить в код: строка для платёжного QR
Сам генератор кодирует любую строку. Чтобы QR в счёте распознал банковский сканер, строка должна соответствовать ГОСТ Р 56042-2014. Формат — пары «ключ=значение» через вертикальную черту.
ST00012|Name=ООО Ромашка|PersonalAcc=40702810900000000001|BankName=ПАО Банк|BIC=044525000|CorrespAcc=30101810400000000225|PayeeINN=7700000000|Sum=1250000|Purpose=Оплата по счёту 15
Разбор:
| Фрагмент | Что значит |
|---|---|
ST0001 | Идентификатор формата |
2 после него | Кодировка: 1 — WIN1251, 2 — UTF-8, 3 — KOI8-R |
Name, PersonalAcc, BankName, BIC, CorrespAcc | Обязательные реквизиты получателя |
Sum | Сумма в копейках: 1250000 = 12 500,00 ₽ |
Purpose, PayeeINN и др. | Необязательные реквизиты |
Сборка строки в коде:
Части = Новый Массив;
Части.Добавить("ST00012");
Части.Добавить("Name=" + НаименованиеПолучателя);
Части.Добавить("PersonalAcc=" + НомерСчета);
Части.Добавить("BankName=" + НаименованиеБанка);
Части.Добавить("BIC=" + БИК);
Части.Добавить("CorrespAcc=" + КоррСчет);
Части.Добавить("Sum=" + Формат(СуммаДокумента * 100, "ЧГ=0; ЧН=0"));
Части.Добавить("Purpose=" + НазначениеПлатежа);
СтрокаДляQR = СтрСоединить(Части, "|");
Символ | внутри значений сломает разбор. Перед сборкой уберите его из наименований и назначения платежа, например через СтрЗаменить(Значение, "|", " ").
Для других задач (ссылка на сайт, номер документа, данные для склада) формат свободный. Чем короче строка, тем крупнее модули кода и тем надёжнее он читается.
Почему QR-код не печатается или не читается
Ещё две ситуации, которые не видны сразу:
- 🖥️ Веб-клиент. Генерация в серверном контексте работает в любом клиенте. Проблемы появляются, если код компоненты по ошибке вызывается на клиенте: в браузере компоненте нужна отдельная установка.
- 🔁 После обновления конфигурации QR пропал. Значит, доработку вносили прямо в типовой макет, и обновление его заменило. Перенесите изменения в расширение.
Частые вопросы
Можно ли вставить QR-код в печатную форму без программирования?
Какое значение ТипКода соответствует QR?
Как сохранить QR-код в файл PNG?
Сколько текста помещается в QR-код?
Как показать QR-код на форме, а не только в печати?
Источники
- ГОСТ Р 56042-2014 «Стандарты финансовых операций. Двумерные символы штрихового кода для осуществления платежей физических лиц»