Как организовать автоматический прием платежей от банка через HTTP-сервисы в 1С?

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

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

Архитектурное решение: HTTP-сервисы против промежуточных шлюзов

При получении спецификаций от банка, подразумевающих использование протокола HTTPS и метода GET, у разработчика есть два пути. Первый — использование промежуточного сервера на языке PHP, Node.js или Go, который будет принимать запросы и транслировать их в базу данных. Второй — использование штатного механизма 1С:Предприятие HTTP-сервисы.

Проанализируем ситуацию: если ваша база работает в клиент-серверном варианте, то 1С прекрасно справляется с параллельными запросами. Использование «прослоек» только усложнит архитектуру. Разберем по шагам, как настроить систему для прямой работы с банком.

Шаг 1. Публикация базы и настройка веб-сервера

Чтобы 1С могла «слушать» внешние запросы, ее необходимо опубликовать на веб-сервере. Чаще всего используются IIS (Internet Information Services) или Apache. Рассмотрим ключевые нюансы настройки:

  1. SSL-сертификат: Поскольку банк требует HTTPS, на веб-сервер должен быть установлен валидный SSL-сертификат. Это обеспечит шифрование данных и доверие со стороны банковской системы.
  2. Ограничение по IP: В требованиях банка часто указаны конкретные IP-адреса подсети. Безопаснее всего настроить фильтрацию входящего трафика на уровне веб-сервера (например, в IIS через модуль «IP Address and Domain Restrictions»). Это отсечет нежелательные запросы еще до того, как они попадут в 1С.
  3. Публикация HTTP-сервиса: При публикации через конфигуратор (Администрирование — Публикация на веб-сервере) обязательно убедитесь, что на вкладке «HTTP-сервисы» отмечен ваш сервис.

Шаг 2. Настройка многопоточности через пул соединений

Банки часто выдвигают требование к поддержке 10–15 одновременных соединений. В 1С это решается настройкой пула соединений в файле default.vrd. Выясним причину, почему это важно: создание нового сеанса при каждом запросе занимает несколько секунд, что может привести к превышению таймаута в 15 секунд.

Откроем файл default.vrd и отредактируем параметры пула:


<point ...>
    <httpServices publishByDefault="false">
        <service name="PaymentService" rootUrl="payments" />
    </httpServices>
    <pool size="20" timeout="10" />
</point>

Параметр poolSize определяет количество одновременно «живущих» сеансов, готовых мгновенно обработать запрос. Для выполнения условия банка в 15 соединений установите значение с небольшим запасом (например, 20).

Шаг 3. Создание HTTP-сервиса в конфигураторе

Перейдем к разработке в конфигураторе. Нам необходимо создать новый объект HTTP-сервис. Назовем его, например, ПриемПлатежей.

  1. Создадим Шаблон URL. Если банк присылает запрос на адрес вида .../hs/payments/check, то шаблон будет /check.
  2. Внутри шаблона создадим Метод. Выберем тип метода GET.
  3. Сформируем обработчик метода в модуле HTTP-сервиса.

Посмотрим на пример кода для обработки входящих параметров:


Функция checkGET(Запрос)
    
    // Извлекаем параметры из строки запроса
    АбонентID = Запрос.ПараметрыЗапроса.Получить("account");
    СуммаПлатежа = Запрос.ПараметрыЗапроса.Получить("amount");
    ТранзакцияID = Запрос.ПараметрыЗапроса.Получить("txn_id");
    
    // Проанализируем полученные данные (проверка существования абонента)
    РезультатПроверки = ПроверитьАбонентаВБазе(АбонентID);
    
    // Формируем XML-ответ
    ОтветТекст = СформироватьXMLОтвет(РезультатПроверки, ТранзакцияID);
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки(ОтветТекст, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    Ответ.Заголовки.Вставить("Content-Type", "application/xml; charset=utf-8");
    
    Возврат Ответ;
    
КонецФункции

Шаг 4. Формирование корректного XML-ответа

Банковские системы строго относятся к формату ответа. Использование простых строк для сборки XML чревато ошибками с кодировкой. Рассмотрим правильный способ с использованием объекта ЗаписьXML.


Функция СформироватьXMLОтвет(Статус, ИД)
    
    Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку("UTF-8");
    Запись.ЗаписатьОбъявлениеXML();
    
    Запись.ЗаписатьНачалоЭлемента("response");
    
    Запись.ЗаписатьНачалоЭлемента("status");
    Запись.ЗаписатьТекст(Строка(Статус));
    Запись.ЗаписатьКонецЭлемента();
    
    Запись.ЗаписатьНачалоЭлемента("txn_id");
    Запись.ЗаписатьТекст(ИД);
    Запись.ЗаписатьКонецЭлемента();
    
    Запись.ЗаписатьКонецЭлемента(); // response
    
    Возврат Запись.Закрыть();
    
КонецФункции

Шаг 5. Оптимизация производительности и соблюдение таймаутов

Важным требованием является скорость ответа (до 15 секунд). Если логика разнесения платежа по счетам сложная и затрагивает проведение множества документов, мы рискуем не уложиться в лимит. Выясним, как этого избежать.

Рекомендуемая схема:

  1. При получении запроса 1С только проверяет существование абонента.
  2. Данные о платеже записываются в специальный Регистр сведений «ОчередьПлатежей».
  3. Банку немедленно отправляется ответ «ОК, платеж принят в обработку».
  4. Раз в минуту срабатывает Регламентное задание, которое выбирает записи из регистра и создает документы «Поступление на расчетный счет» или «Оплата от покупателя».

Такой подход гарантирует минимальное время отклика HTTP-сервиса и стабильность системы даже при пиковых нагрузках.

Шаг 6. Отладка и логирование

Поскольку мы работаем с внешним сервисом, обычная отладка через точку останова может быть затруднена. Настроим систему логирования. Создадим справочник или регистр ЛогВходящихЗапросов, куда будем записывать:

Это позволит оперативно решать спорные ситуации с техподдержкой банка, если какой-то платеж будет отклонен или «потерян».

Лицензирование

Помните, что каждое активное соединение через HTTP-сервис технически занимает одну лицензию 1С на время выполнения запроса. В клиент-серверном варианте, благодаря использованию пула, лицензия освобождается сразу после отправки ответа. Однако при интенсивном потоке (15 одновременных соединений) необходимо убедиться, что в кластере 1С имеется достаточный запас свободных лицензий.

Таким образом, мы проанализировали основные этапы создания системы приема платежей. Использование встроенных HTTP-сервисов в сочетании с правильной настройкой веб-сервера и очередью обработки позволяет создать надежное и быстрое решение без привлечения сторонних языков программирования.

← На главную