QR-код в печатной форме 1С 8.3: от строки данных до картинки на бланке

· 9 мин

Содержание

Чтобы вставить QR-код в 1С 8.3, нужны три вещи: строка, которую вы кодируете, генератор картинки и место под неё в макете. В типовых конфигурациях на БСП генератор уже есть — это общий модуль ГенерацияШтрихкода, функция ИзображениеШтрихкода(). Готовую картинку кладут в объект «Рисунок» в макете печатной формы, и QR печатается вместе с документом.

Частое заблуждение — что для генерации QR-кодов нужно покупать стороннюю компоненту или ходить в интернет. Нет: в большинстве современных конфигураций всё работает «из коробки», внешние сервисы нужны только в нестандартных случаях. Ниже — все рабочие способы, код и разбор ошибок.

Что уже умеют платформа и типовые конфигурации

Сама платформа 1С:Предприятие 8.3 не содержит отдельного объекта «QR-код» для печати. Картинку рисует внешняя компонента печати штрихкодов. В типовых конфигурациях она лежит в общем макете, а вызывает её подсистема БСП «Генерация штрихкода».

Как проверить, что механизм есть в вашей базе:

  1. Откройте Конфигуратор: Конфигурация → Открыть конфигурацию.
  2. В дереве раскройте Общие → Общие модули.
  3. Найдите модуль ГенерацияШтрихкода (удобно через поиск по дереву, 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 (например, ссылка на сайт компании), сгенерируйте картинку один раз до цикла и подставляйте её в каждую область. Генерация на каждый документ заметно замедляет печать большого комплекта.
  • ⚙️ Где вызывать. Печатные формы в типовых конфигурациях собираются на сервере, поэтому функцию вызывайте в серверном контексте.

Внешняя компонента: когда БСП нет или она старая

В самописных и старых конфигурациях модуля ГенерацияШтрихкода нет. Тогда компоненту печати штрихкодов подключают напрямую.

Порядок такой:

  1. Возьмите компоненту из любой типовой конфигурации: общий макет с компонентой печати штрихкодов (найдите в Общие → Общие макеты по слову «Штрихкод»).
  2. Скопируйте макет в свою конфигурацию — лучше через расширение, если конфигурация на поддержке.
  3. Подключите компоненту методом ПодключитьВнешнююКомпоненту() с указанием пути к макету и типа ТипВнешнейКомпоненты.Native.
  4. Создайте объект компоненты через Новый("AddIn.<Имя>.<Объект>"), задайте свойства (тип кода, размеры, значение) и получите картинку.

Точные имена свойств компоненты зависят от её версии. Самый быстрый способ их узнать — посмотреть, как к компоненте обращается модуль ГенерацияШтрихкода в свежей типовой конфигурации. Этот код можно взять за образец.

Сравнение вариантов:

СпособКогда подходитРиски
Модуль ГенерацияШтрихкода (БСП)Типовые конфигурации на актуальной БСППочти нет: обновляется вместе с конфигурацией
Компонента напрямуюСамописные базы, старая БСПСвой код подключения, следить за версией компоненты
Сторонние компонентыНужны особые форматы или оформлениеЛицензия, совместимость с Linux и веб-клиентом
HTTP-сервисНет компоненты, есть интернетДанные уходят третьей стороне, зависимость от сети

Компонента должна работать там, где выполняется код. Если сервер 1С на Linux, а вы взяли компоненту только под Windows, генерация упадёт на сервере, хотя у разработчика в файловой базе всё работало.

Как поставить QR-код в макет печатной формы

Картинку мало получить — её нужно вывести в нужное место бланка. Для этого в макете делают рисунок-заглушку.

Подготовка макета

  1. Откройте макет печатной формы в Конфигураторе (или в расширении, если форма типовая).
  2. Выделите ячейки, где должен стоять код.
  3. Вставьте рисунок через меню Таблица → Рисунки → Картинка.
  4. В палитре свойств рисунка задайте Имя, например QRКод.
  5. Свойство Размер картинки установите в «Пропорционально». Иначе квадратный код растянется и перестанет читаться.
  6. Поставьте рисунок внутрь именованной области (например, Шапка), чтобы он попадал в вывод вместе с ней.

Заполнение при печати

В процедуре формирования печатной формы после получения области присвойте картинку рисунку:

ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Рисунки.QRКод.Картинка = КартинкаQRКода(СтрокаДляQR);
ТабДок.Вывести(ОбластьШапка);

Обращение идёт по имени рисунка из палитры свойств. Если имя другое, получите ошибку обращения к несуществующему элементу коллекции.

Типовую печатную форму не правьте в основной конфигурации. Добавьте рисунок в макет и код вывода через расширение конфигурации — тогда обновления не затрут доработку, и не придётся снимать конфигурацию с поддержки.

Внешняя печатная форма с QR-кодом

Если доступа к Конфигуратору нет или не хочется трогать конфигурацию, делают внешнюю печатную форму. Она подключается в пользовательском режиме.

Что нужно в обработке:

  • 📄 макет с рисунком QRКод, подготовленный так же, как выше;
  • 🔧 экспортная функция СведенияОВнешнейОбработке() — сообщает БСП вид обработки («Печатная форма») и документы, к которым она относится;
  • 🖨️ экспортная процедура Печать() — формирует табличный документ, вызывает ГенерацияШтрихкода и заполняет рисунок.

Подключение в Бухгалтерии 3.0, ЗУП 3.1, УТ 11:

  1. Администрирование → Печатные формы, отчеты и обработки.
  2. Включите флажок «Дополнительные отчеты и обработки», если он снят.
  3. Откройте список «Дополнительные отчеты и обработки» и добавьте файл .epf.
  4. На закладке размещения укажите документы, в меню печати которых появится форма.
  5. Запишите карточку и проверьте печать из документа.

Внешняя обработка выполняется в контексте конфигурации, поэтому вызов ГенерацияШтрихкода из неё работает так же, как из встроенного кода.

Генерация через 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?
В модуле ГенерацияШтрихкода QR-код задаётся значением 16. Остальные значения смотрите в комментариях к функции ПараметрыГенерацииШтрихкода().
Как сохранить QR-код в файл PNG?
У полученного объекта Картинка вызовите метод Записать с путём к файлу. Если нужны двоичные данные, возьмите их из результата ИзображениеШтрихкода или через ПолучитьДвоичныеДанные() у картинки.
Сколько текста помещается в QR-код?
Стандарт допускает несколько тысяч символов, но для печати держите строку короткой: до 200–300 символов код остаётся крупным и уверенно сканируется телефоном.
Как показать QR-код на форме, а не только в печати?
Добавьте на форму реквизит-строку, выведите его полем картинки и запишите туда адрес картинки во временном хранилище через ПоместитьВоВременноеХранилище().

Источники

  • ГОСТ Р 56042-2014 «Стандарты финансовых операций. Двумерные символы штрихового кода для осуществления платежей физических лиц»