Как добавить QR-код для оплаты в счет на старой конфигурации 1С 8.2 / 8.3 (обычные формы)?

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

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

Рассмотрим несколько практических способов решения этой задачи, от самых простых до более сложных, которые позволят реализовать функционал без кардинального обновления всей системы. Для быстрого получения результата можно использовать готовое решение для формирования печатной формы счета с QR-кодом.

Решение 1: Использование внешних интернет-сервисов (API)

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

Разберем этот процесс по шагам:

  1. Формирование строки для QR-кода.

    Самый важный этап — правильно собрать текстовую строку со всеми реквизитами для оплаты. Стандарт для таких QR-кодов в России определен в ГОСТ Р 56042-2014. Строка представляет собой набор пар "ключ=значение", разделенных символом "|".

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

    • ST00012 — стандарт (версия 2)
    • Name — Наименование получателя
    • PersonalAcc — Расчетный счет получателя
    • BankName — Наименование банка получателя
    • BIC — БИК банка получателя
    • CorrespAcc — Корр. счет банка получателя

    Дополнительные реквизиты:

    • Sum — Сумма платежа в копейках
    • Purpose — Назначение платежа
    • PayeeINN — ИНН получателя
    • KPP — КПП получателя
    • LastName, FirstName, MiddleName — ФИО плательщика (если известно)
    • PaymId — Уникальный идентификатор платежа (УИП). Очень рекомендуется его формировать (например, на основе номера и даты счета), так как это значительно упрощает последующую идентификацию платежа при разборе банковской выписки.

    Пример кода для формирования строки:

    
    // Предполагается, что реквизиты берутся из документа "СчетНаОплату"
    // Сумму нужно передавать в копейках
    СуммаВКопейках = ДокументОбъект.СуммаДокумента * 100;
    НазначениеПлатежа = "Оплата по счету №" + ДокументОбъект.Номер + " от " + Формат(ДокументОбъект.Дата, "ДФ=dd.MM.yyyy");
    
    // Собираем строку по стандарту
    СтрокаQR = "ST00012|";
    СтрокаQR = СтрокаQR + "Name=" + СокрЛП(Организация.Наименование) + "|";
    СтрокаQR = СтрокаQR + "PersonalAcc=" + СокрЛП(БанковскийСчет.НомерСчета) + "|";
    СтрокаQR = СтрокаQR + "BankName=" + СокрЛП(БанковскийСчет.Банк.Наименование) + "|";
    СтрокаQR = СтрокаQR + "BIC=" + СокрЛП(БанковскийСчет.Банк.БИК) + "|";
    СтрокаQR = СтрокаQR + "CorrespAcc=" + СокрЛП(БанковскийСчет.Банк.КоррСчет) + "|";
    СтрокаQR = СтрокаQR + "PayeeINN=" + СокрЛП(Организация.ИНН) + "|";
    Если ЗначениеЗаполнено(Организация.КПП) Тогда
        СтрокаQR = СтрокаQR + "KPP=" + СокрЛП(Организация.КПП) + "|";
    КонецЕсли;
    СтрокаQR = СтрокаQR + "Sum=" + СуммаВКопейках + "|";
    СтрокаQR = СтрокаQR + "Purpose=" + НазначениеПлатежа + "|";
    
  2. Отправка HTTP-запроса и получение картинки.

    Для отправки запроса в старых конфигурациях удобно использовать COM-объект WinHttp.WinHttpRequest.5.1. Существует множество бесплатных API для генерации QR-кодов. Вы отправляете GET-запрос, где в параметрах передаете сформированную строку.

    Посмотрим на пример кода, который выполняет запрос и сохраняет результат во временный файл.

    
    // Адрес сервиса может быть другим, это лишь пример
    АдресСервиса = "https://api.qrserver.com/v1/create-qr-code/?data=";
    ПолныйURL = АдресСервиса + СформированнаяСтрокаQR;
    
    Попытка
        // Для старых платформ может потребоваться COMОбъект
        HTTP = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
        HTTP.Open("GET", ПолныйURL, ложь);
        HTTP.Send();
    
        Если HTTP.Status = 200 Тогда
            // Получаем двоичные данные картинки
            ДвоичныеДанныеКартинки = HTTP.ResponseBody;
    
            // Сохраняем во временный файл
            ИмяВременногоФайла = ПолучитьИмяВременногоФайла("png");
            
            // В старых версиях платформы может потребоваться объект Stream
            Stream = Новый COMОбъект("ADODB.Stream");
            Stream.Type = 1; // adTypeBinary
            Stream.Open();
            Stream.Write(ДвоичныеДанныеКартинки);
            Stream.SaveToFile(ИмяВременногоФайла, 2); // adSaveCreateOverWrite
            Stream.Close();
            
            // Возвращаем путь к файлу
            ПутьККартинке = ИмяВременногоФайла;
        Иначе
            Сообщить("Ошибка получения QR-кода. Статус: " + HTTP.Status);
            ПутьККартинке = "";
        КонецЕсли;
    
    Исключение
        Сообщить("Не удалось выполнить HTTP-запрос: " + ОписаниеОшибки());
        ПутьККартинке = "";
    КонецПопытки;
    
  3. Вставка изображения в макет счета.

    Полученное изображение нужно вставить в табличный документ (макет печатной формы) как объект типа "Картинка".

    
    // ТабДок - это ваш табличный документ, куда выводится счет
    Если НЕ ПустаяСтрока(ПутьККартинке) Тогда
        // Получаем область в макете, куда нужно вставить QR-код
        ОбластьQR = Макет.ПолучитьОбласть("ОбластьQRКода");
        
        // Вставляем картинку из временного файла
        КартинкаQR = Новый Картинка(ПутьККартинке);
        Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
        
        // Позиционируем рисунок в нужной области
        Рисунок.Картинка = КартинкаQR;
        Рисунок.Расположить(ОбластьQR);
        Рисунок.РазмерКартинки = РазмерКартинки.АвтоРазмер;
        
        // Не забываем удалить временный файл после использования
        УдалитьФайлы(ПутьККартинке);
    КонецЕсли;
    

Решение 2: Использование готовых компонент и обработок

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

Принцип работы с компонентой обычно сводится к нескольким шагам:

  1. Подключить компоненту (часто через установку макета в качестве двоичных данных).
  2. Вызвать метод компоненты, передав ему строку с данными.
  3. Получить в ответ картинку или путь к временному файлу с ней.
  4. Вставить картинку в макет, как было описано в предыдущем решении.

Решение 3: Генерация через COM-объект и .NET-библиотеки

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

  1. Создание COM-обертки. Вы или ваш .NET-разработчик создаете простую библиотеку классов (.dll) на C# или VB.NET. Эта библиотека использует популярную и бесплатную .NET-библиотеку, например, QRCoder, для генерации изображения QR-кода. Главное требование — сделать эту сборку COM-видимой.
  2. Регистрация компоненты. Полученную .dll нужно зарегистрировать в операционной системе на сервере 1С или на клиентских машинах, где будет формироваться счет. Это делается с помощью утилиты regasm.exe.
  3. Вызов из 1С. После регистрации вы можете обращаться к методам вашей .NET-библиотеки прямо из кода 1С через создание COMОбъект.

Пример вызова из 1С может выглядеть так:


Попытка
    // "MyQRCodeGenerator.Generator" - это имя, под которым зарегистрирован ваш COM-объект
    ГенераторQR = Новый COMОбъект("MyQRCodeGenerator.Generator");
    
    // Вызываем метод, который принимает строку и возвращает путь к файлу с картинкой
    ПутьККартинке = ГенераторQR.GenerateQRCodeToFile(СформированнаяСтрокаQR, 300, 300); // Передаем строку и размеры
    
    // Дальнейшая вставка картинки в макет
    // ...
Исключение
    Сообщить("Не удалось создать или использовать COM-объект для генерации QR-кода.");
КонецПопытки;

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

← На главную