Гайд 1С: Разработка и публикация собственных HTTP-сервисов на веб-сервере
При разработке и промышленной эксплуатации HTTP-сервисов 1С возникают проблемы:
- Ошибки
HTTP 500 Internal Server Errorпри пиковых нагрузках. - Длительное время ответа (Time-To-First-Byte > 2-3 сек) из-за постоянной инициализации нового сеанса 1С на каждый входящий запрос.
- Ошибки блокировок и взаимные дедлоки сеансов веб-сервиса.
- Ошибки публикации в веб-серверах Apache / IIS после обновления платформы 1С.
1. Разработка метода HTTP-сервиса с правильными заголовками
В конфигураторе создайте объект HTTP-сервис с корневым URL (например, api/v1) и шаблоном URL /orders/{id}:
Функция ordersПолучить(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
ИдентификаторЗаказа = Запрос.ПараметрыURL.Получить("id");
// Получение данных без транзакционных оверхедов
Данные = ПолучитьСтруктуруЗаказа(ИдентификаторЗаказа);
Если Данные = Неопределено Тогда
Возврат Новый HTTPСервисОтвет(404);
КонецЕсли;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Данные);
Ответ.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть());
Возврат Ответ;
КонецФункции2. Тюнинг пула сеансов в файле default.vrd
Чтобы исключить создание нового сеанса на каждый запрос, настройте переиспользование сеансов (Session Pooling) в файле публикации default.vrd:
<point xmlns="http://v8.1c.ru/sng/vrd" base="/app" ib="Srvr=srv-1c;Ref=prod;">
<httpServices publishByDefault="true"/>
<!-- Настройка пула сеансов для мгновенного ответа -->
<pool minSize="5"
maxSize="30"
waitTimeout="5"
lifeTime="1800"/>
</point> Частые вопросы (FAQ)
Чем HTTP-сервисы 1С отличаются от Web-сервисов (SOAP)?
HTTP-сервисы работают по легковесному протоколу REST (JSON/XML), не требуют сложного WSDL-контракта, потребляют значительно меньше трафика и обладают более высокой производительностью.
Какую роль играют параметры minSize и maxSize в пуле сеансов default.vrd?
minSize задает количество постоянно прогретых готовых сеансов 1С в памяти веб-сервера. maxSize ограничивает максимальный параллельный лимит сеансов, защищая кластер от перегрузки.
Как авторизовать входящие запросы к HTTP-сервису?
Используйте Basic Authentication (передача логина/пароля пользователя 1С в заголовке Authorization) или реализуйте проверку Bearer JWT-токенов в коде самого сервиса.
Нужно ли перезапускать веб-сервер Apache/IIS после изменения кода модуля HTTP-сервиса?
Если сеансы находятся в пуле (pool), веб-сервер может кэшировать старый контекст конфигурации. Для гарантированного применения изменений выполните reload веб-сервера.