В современной практике ведения бизнеса ручная синхронизация платежей из банковских выписок постепенно уходит в прошлое. Когда компания сталкивается с необходимостью обрабатывать сотни и тысячи транзакций от абонентов в реальном времени (через терминалы, сайты или мобильные приложения), встает задача создания автоматизированного шлюза. Рассмотрим подробно, как реализовать прием входящих запросов от банка непосредственно в 1С, соблюдая требования по безопасности, скорости и многопоточности.
При получении спецификаций от банка, подразумевающих использование протокола HTTPS и метода GET, у разработчика есть два пути. Первый — использование промежуточного сервера на языке PHP, Node.js или Go, который будет принимать запросы и транслировать их в базу данных. Второй — использование штатного механизма 1С:Предприятие HTTP-сервисы.
Проанализируем ситуацию: если ваша база работает в клиент-серверном варианте, то 1С прекрасно справляется с параллельными запросами. Использование «прослоек» только усложнит архитектуру. Разберем по шагам, как настроить систему для прямой работы с банком.
Чтобы 1С могла «слушать» внешние запросы, ее необходимо опубликовать на веб-сервере. Чаще всего используются IIS (Internet Information Services) или Apache. Рассмотрим ключевые нюансы настройки:
Банки часто выдвигают требование к поддержке 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).
Перейдем к разработке в конфигураторе. Нам необходимо создать новый объект HTTP-сервис. Назовем его, например, ПриемПлатежей.
.../hs/payments/check, то шаблон будет /check.GET.Посмотрим на пример кода для обработки входящих параметров:
Функция checkGET(Запрос)
// Извлекаем параметры из строки запроса
АбонентID = Запрос.ПараметрыЗапроса.Получить("account");
СуммаПлатежа = Запрос.ПараметрыЗапроса.Получить("amount");
ТранзакцияID = Запрос.ПараметрыЗапроса.Получить("txn_id");
// Проанализируем полученные данные (проверка существования абонента)
РезультатПроверки = ПроверитьАбонентаВБазе(АбонентID);
// Формируем XML-ответ
ОтветТекст = СформироватьXMLОтвет(РезультатПроверки, ТранзакцияID);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(ОтветТекст, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Ответ.Заголовки.Вставить("Content-Type", "application/xml; charset=utf-8");
Возврат Ответ;
КонецФункции
Банковские системы строго относятся к формату ответа. Использование простых строк для сборки XML чревато ошибками с кодировкой. Рассмотрим правильный способ с использованием объекта ЗаписьXML.
Функция СформироватьXMLОтвет(Статус, ИД)
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку("UTF-8");
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("response");
Запись.ЗаписатьНачалоЭлемента("status");
Запись.ЗаписатьТекст(Строка(Статус));
Запись.ЗаписатьКонецЭлемента();
Запись.ЗаписатьНачалоЭлемента("txn_id");
Запись.ЗаписатьТекст(ИД);
Запись.ЗаписатьКонецЭлемента();
Запись.ЗаписатьКонецЭлемента(); // response
Возврат Запись.Закрыть();
КонецФункции
Важным требованием является скорость ответа (до 15 секунд). Если логика разнесения платежа по счетам сложная и затрагивает проведение множества документов, мы рискуем не уложиться в лимит. Выясним, как этого избежать.
Рекомендуемая схема:
Такой подход гарантирует минимальное время отклика HTTP-сервиса и стабильность системы даже при пиковых нагрузках.
Поскольку мы работаем с внешним сервисом, обычная отладка через точку останова может быть затруднена. Настроим систему логирования. Создадим справочник или регистр ЛогВходящихЗапросов, куда будем записывать:
Это позволит оперативно решать спорные ситуации с техподдержкой банка, если какой-то платеж будет отклонен или «потерян».
Помните, что каждое активное соединение через HTTP-сервис технически занимает одну лицензию 1С на время выполнения запроса. В клиент-серверном варианте, благодаря использованию пула, лицензия освобождается сразу после отправки ответа. Однако при интенсивном потоке (15 одновременных соединений) необходимо убедиться, что в кластере 1С имеется достаточный запас свободных лицензий.
Таким образом, мы проанализировали основные этапы создания системы приема платежей. Использование встроенных HTTP-сервисов в сочетании с правильной настройкой веб-сервера и очередью обработки позволяет создать надежное и быстрое решение без привлечения сторонних языков программирования.