Как сгенерировать QR-код на счете в 1С без использования БСП и интернета

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

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

Способ 1: Использование встроенных возможностей платформы 1С

Начиная с версии платформы 8.3.10, компания «1С» добавила встроенный функционал для работы со штрихкодами непосредственно в объектах табличного документа. Это самый оптимальный и производительный метод, так как он не требует внешних файлов, библиотек или регистрации DLL-компонент. Разберем по шагам, как это реализовать.

Сначала нам необходимо подготовить макет печатной формы. В нужное место макета мы добавим объект Рисунок. Для этого в меню «Таблица» выберем «Рисунки» — «Вставить штрихкод».

После вставки рисунка проанализируем его свойства:

  1. Найдем свойство Тип штрихкода и установим значение QR.
  2. В поле Текст кода можно временно вписать тестовую строку.
  3. Установим флаг Отображать текст в значение «Ложь», если нам не нужно дублирование текста под кодом.

Теперь перейдем к программной части в модуле менеджера или модуле объекта, где формируется печатная форма. Нам нужно передать данные в этот рисунок. Рассмотрим пример кода:


// Получаем область макета, где расположен QR-код
ОбластьМакета = Макет.ПолучитьОбласть("ЗаголовокСчета");

// Обращаемся к рисунку по имени, которое мы задали в макете (например, "РисунокQR")
РисунокQR = ОбластьМакета.Рисунки.РисунокQR;

// Формируем строку по стандарту ГОСТ Р 56042-2014
ТекстДляКода = "ST00012|Name=ООО Наша Компания|PersonalAcc=40702810000000000000|BankName=ПАО СБЕРБАНК|BIC=044525225|CorrespAcc=30101810400000000225";

// Устанавливаем текст кода
РисунокQR.Объект.ТекстКода = ТекстДляКода;

// Выводим область в табличный документ
ТабДок.Вывести(ОбластьМакета);

Важно помнить, что этот метод работает на уровне платформы, поэтому он максимально стабилен и не зависит от обновлений операционной системы или стороннего ПО.

Способ 2: Использование внешних Native API компонент

Если по каким-то причинам стандартный механизм платформы не подходит (например, требуется специфический уровень коррекции ошибок или работа на очень старых версиях 8.3), мы можем воспользоваться технологией Native API. Это внешние компоненты (библиотеки .dll), которые 1С умеет подключать и использовать как внутренние объекты.

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

Разберем алгоритм работы с компонентой:


// 1. Извлекаем компоненту из макета во временный файл
ИмяФайлаКомпоненты = ПолучитьИмяВременногоФайла("dll");
МакетКомпоненты = УправлениеОтчетами.ПолучитьОбщийМакет("КомпонентаПечатиШтрихкодов");
МакетКомпоненты.Записать(ИмяФайлаКомпоненты);

// 2. Подключаем компоненту
РезультатПодключения = УстановитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов");

Если РезультатПодключения Тогда
    // 3. Создаем объект компоненты
    QRОбъект = Новый("AddIn.Barcode.Barcode");
    
    // 4. Настраиваем параметры
    QRОбъект.ТипКода = 16; // 16 обычно соответствует QR-коду в популярных библиотеках
    QRОбъект.Текст = "Ваши реквизиты";
    QRОбъект.Ширина = 150;
    QRОбъект.Высота = 150;
    
    // 5. Получаем картинку
    ДвоичныеДанныеКартинки = QRОбъект.ПолучитьШтрихкод();
    КартинкаQR = Новый Картинка(ДвоичныеДанныеКартинки);
КонецЕсли;

Преимущество этого метода в том, что он полностью автономен. Компонента загружается в память 1С при запуске печатной формы и выгружается после завершения работы, не оставляя лишних следов в системе.

Способ 3: Формирование через JavaScript и HTML-поле

Это достаточно креативный метод, который часто используют разработчики, когда не хотят возиться с регистрацией DLL. Выясним, как это работает: внутри формы 1С создается невидимое ПолеHTMLДокумента. В него загружается локальная библиотека на языке JavaScript (например, qrcode.js), которая генерирует изображение QR-кода прямо в памяти браузера, встроенного в 1С.

Рассмотрим шаги реализации:

  1. Сохраняем текст JS-библиотеки в текстовый макет конфигурации.
  2. В коде 1С формируем HTML-строку, куда внедряем этот JS-код и передаем нашу строку с реквизитами.
  3. После загрузки страницы в поле HTML, мы можем программно «вытащить» сформированное изображение в формате Base64 и преобразовать его в объект Картинка для вывода в печатную форму.

Этот метод хорош тем, что он кроссплатформенный и будет работать даже в веб-клиенте без установки дополнительных расширений на сервер.

Способ 4: Командная строка и сторонние утилиты

Рассмотрим еще один надежный вариант — использование консольных генераторов, таких как qrencode. Это небольшие исполняемые файлы (exe), которые принимают на вход текст и сохраняют картинку в указанную папку.

Посмотрим на пример кода, вызывающего такую утилиту:


// Определяем пути
ПутьКПрограмме = "C:\Tools\qrencode.exe";
ПутьКФайлуРезультата = ПолучитьИмяВременногоФайла("png");
ТекстРеквизитов = "ST00012|Name=...|BIC=...";

// Формируем командную строку
Команда = ПутьКПрограмме + " -o " + ПутьКФайлуРезультата + " """ + ТекстРеквизитов + """";

// Запускаем приложение в скрытом режиме
ЗапуститьПриложение(Команда, , Истина);

// Читаем результат
Если ФайлСуществует(ПутьКФайлуРезультата) Тогда
    КартинкаQR = Новый Картинка(ПутьКФайлуРезультата);
    // Помещаем в макет...
КонецЕсли;

Этот способ крайне прост в отладке, но требует наличия exe-файла на диске пользователя. Мы рекомендуем хранить этот файл внутри конфигурации в двоичных данных и выгружать его во временную папку непосредственно перед использованием.

Важный нюанс: Стандарт ГОСТ Р 56042-2014

Проанализируем ситуацию: просто сгенерировать QR-код недостаточно. Чтобы банковское приложение корректно распознало счет, данные внутри кода должны быть структурированы по ГОСТ Р 56042-2014. Выясним основные правила формирования этой строки.

Обязательные требования:

Разберем пример функции для сборки такой строки:


Функция СформироватьСтрокуДляQR(ДанныеСчета)
    
    Результат = "ST00012|";
    Результат = Результат + "Name=" + СокрЛП(ДанныеСчета.Организация) + "|";
    Результат = Результат + "PersonalAcc=" + СокрЛП(ДанныеСчета.НомерСчета) + "|";
    Результат = Результат + "BankName=" + СокрЛП(ДанныеСчета.Банк) + "|";
    Результат = Результат + "BIC=" + СокрЛП(ДанныеСчета.БИК) + "|";
    Результат = Результат + "CorrespAcc=" + СокрЛП(ДанныеСчета.КоррСчет) + "|";
    
    // Дополнительные поля по желанию
    Результат = Результат + "Sum=" + Формат(ДанныеСчета.Сумма * 100, "ЧГ=0") + "|"; // Сумма в копейках
    Результат = Результат + "Purpose=" + "Оплата по счету №" + ДанныеСчета.Номер;
    
    Возврат Результат;
    
КонецФункции

Подведение итогов

Мы рассмотрели четыре различных подхода к генерации QR-кодов без использования БСП. Наиболее современным и рекомендуемым является использование встроенного объекта «Рисунок» с типом «Штрихкод» в платформе 1С 8.3.10+. Если же ваша версия платформы ниже или требуются специфические настройки, использование внешней Native API компоненты, упакованной в макет двоичных данных, станет отличной альтернативой.

Главное при реализации — строго придерживаться формата ГОСТ и следить за кодировкой UTF-8. Это гарантирует, что ваши счета будут без проблем оплачиваться клиентами через любые мобильные приложения банков.

← На главную