Как реализовать генерацию ссылок на оплату и QR-кодов через платежный шлюз Сбербанка в 1С?

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

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

Вариант 1: Формирование QR-кода для оплаты по ГОСТ Р 56042-2014

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

Для реализации этого механизма в 1С удобно использовать встроенные средства БСП (Библиотеки стандартных подсистем). Проанализируем ситуацию на примере формирования структуры данных. Сначала нам необходимо подготовить обязательные реквизиты организации и платежа:


&НаСервере
Функция ЗаполнитьСтруктуруРеквизитовQRКода(Объект)
    пСтруктураРеквизитовQRКода = Новый Структура;
    // Данные получателя
    пСтруктураРеквизитовQRКода.Вставить("Name", СокрЛП(Объект.Организация.Наименование));
    пСтруктураРеквизитовQRКода.Вставить("PersonalAcc", СокрЛП(Объект.РасчетныйСчет.НомерСчета));
    пСтруктураРеквизитовQRКода.Вставить("BankName", СокрЛП(Объект.РасчетныйСчет.Банк.Наименование));
    пСтруктураРеквизитовQRКода.Вставить("BIC", СокрЛП(Объект.РасчетныйСчет.Банк.Код));
    пСтруктураРеквизитовQRКода.Вставить("CorrespAcc", СокрЛП(Объект.РасчетныйСчет.Банк.КоррСчет));
    пСтруктураРеквизитовQRКода.Вставить("PayeeINN", СокрЛП(Объект.Организация.ИНН));
    
    // Данные плательщика и сумма
    пСтруктураРеквизитовQRКода.Вставить("LastName", ""); 
    пСтруктураРеквизитовQRКода.Вставить("PayerAddress", "");
    пСтруктураРеквизитовQRКода.Вставить("Purpose", "");
    пСтруктураРеквизитовQRКода.Вставить("Sum", "0"); 
    
    Возврат пСтруктураРеквизитовQRКода;
КонецФункции

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


&НаСервере
Функция СуммаВКопейкахСтрокой(пКОплатеИтого)
    // Убираем дробную часть и преобразуем в копейки
    СуммаКопейки = пКОплатеИтого * 100;
    лРезультат = Формат(СуммаКопейки, "ЧГ=0"); 
    Возврат лРезультат;
КонецФункции

После подготовки структуры мы должны собрать строку по стандарту ST00012, где поля разделены символом «|». Затем используем метод УправлениеПечатью.ДанныеQRКода для получения двоичных данных картинки, которую можно вывести на форму или в табличный документ.

Вариант 2: Генерация платежной ссылки через REST API (Интернет-эквайринг)

Если ваша задача — отправить клиенту ссылку в SMS или по e-mail, чтобы он мог оплатить заказ картой, SberPay или через СБП, необходимо использовать программный интерфейс платежного шлюза. В отличие от QR-кода, этот метод требует авторизации с использованием логина/пароля API или специального токена. Для предварительной отладки и проверки таких вызовов прямо в интерфейсе программы подойдёт обработка для тестирования REST API в среде 1С.

Процесс интеграции можно разделить на несколько этапов:

1. Регистрация заказа (метод register.do)

Для получения ссылки мы отправляем HTTPЗапрос к шлюзу Сбербанка. Выясним причину, по которой этот метод является основным: именно на этом этапе Сбербанк резервирует номер заказа и формирует уникальную страницу оплаты.

Основные параметры запроса:

Пример формирования запроса в 1С:


&НаСервере
Функция ПолучитьСсылкуНаОплату(НомерЗаказа, Сумма, Описание)
    АдресШлюза = "securepayments.sberbank.ru"; // Для теста используйте sandbox.host.ru
    Ресурс = "/payment/rest/register.do";
    
    ПараметрыЗапроса = Новый Структура;
    ПараметрыЗапроса.Вставить("userName", "ваш_логин");
    ПараметрыЗапроса.Вставить("password", "ваш_пароль");
    ПараметрыЗапроса.Вставить("orderNumber", НомерЗаказа);
    ПараметрыЗапроса.Вставить("amount", Сумма * 100);
    ПараметрыЗапроса.Вставить("returnUrl", "https://your-site.ru/success");
    ПараметрыЗапроса.Вставить("description", Описание);
    
    // Формируем строку параметров
    СтрокаПараметров = "";
    Для Каждого Стр Из ПараметрыЗапроса Цикл
        СтрокаПараметров = СтрокаПараметров + Стр.Ключ + "=" + Стр.Значение + "&";
    КонецЦикла;
    
    HTTPСоединение = Новый HTTPСоединение(АдресШлюза, 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
    HTTPЗапрос = Новый HTTPЗапрос(Ресурс + "?" + СтрокаПараметров);
    
    Попытка
        HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
        Если HTTPОтвет.КодСостояния = 200 Тогда
            ЧтениеJSON = Новый ЧтениеJSON;
            ЧтениеJSON.УстановитьСтроку(HTTPОтвет.ПолучитьТелоКакСтроку());
            ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
            
            Если ДанныеОтвета.Свойство("formUrl") Тогда
                Возврат ДанныеОтвета.formUrl; // Это и есть нужная ссылка
            Иначе
                Сообщить("Ошибка: " + ДанныеОтвета.errorMessage);
            КонецЕсли;
        КонецЕсли;
    Исключение
        Сообщить("Ошибка связи с сервером Сбербанка");
    КонецПопытки;
    
    Возврат Неопределено;
КонецФункции

2. Проверка статуса платежа

Просто отправить ссылку недостаточно. Проанализируем ситуацию: клиент может открыть ссылку, но не завершить оплату. Для синхронизации данных в 1С следует реализовать регламентное задание, которое будет опрашивать метод getOrderStatusExtended.do. В качестве параметра передается orderId (номер заказа в системе банка), полученный при регистрации.

Фискализация и требования 54-ФЗ

Рассмотрим подробнее важный нюанс: если вы принимаете оплату от физических лиц, вы обязаны передавать данные для чека в налоговую. Сбербанк позволяет делать это автоматически через свои облачные кассы. Для этого в запрос register.do нужно добавить параметр orderBundle.

Это сложная структура в формате JSON, которая содержит:

  1. customerDetails — контактные данные покупателя (email или телефон).
  2. cartItems — массив товаров, где для каждой позиции указывается name, quantity, itemAmount и tax (ставка НДС).

В 1С для формирования такой структуры лучше всего использовать объект ЗаписьJSON и передавать его как один из параметров POST-запроса. Для проверки корректности формата и генерации кода работы со сложными структурами данных подойдёт инструмент для валидации JSON и генерации кода 1С.

Особенности работы с сертификатами

При работе с защищенным соединением (HTTPS) в 1С часто возникают сложности с проверкой сертификатов. Выясним причину: Сбербанк может использовать сертификаты Минцифры или собственные удостоверяющие центры. Если 1С выдает ошибку «Удаленный узел не прошел проверку», необходимо:

Использование современных методов: SberPay и СБП

В современных конфигурациях 1С (например, в последних версиях УНФ или УТ 11) механизмы оплаты через СБП уже встроены в типовой функционал. Если же вы пишете свою интеграцию через API Сбербанка, обратите внимание, что метод register.do по умолчанию генерирует страницу, где клиент сам может выбрать способ оплаты: картой или через SberPay. Это значительно повышает конверсию, так как покупателю не нужно вводить данные карты вручную — достаточно подтвердить пуш-уведомление в приложении Сбербанк Онлайн.

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

← На главную