В современной разработке на платформе 1С:Предприятие 8.3 интеграция с внешними системами через HTTP-сервисы стала стандартом де-факто. В отличие от тяжеловесных SOAP-сервисов (Web-сервисов), HTTP-сервисы работают быстрее, проще в настройке и идеально подходят для взаимодействия с веб-сайтами и мобильными приложениями. Чтобы ускорить процесс разработки, можно использовать модуль с универсальными процедурами для быстрой организации и расширения API. В данной статье мы подробно разберем, как спроектировать, реализовать и отладить собственный HTTP-сервис.
Прежде чем переходить к написанию кода, проанализируем структуру объекта HTTPСервис в дереве конфигурации. Каждый сервис состоит из трех ключевых элементов: Корневой URL, Шаблоны URL и Методы. Разберем по шагам, как их правильно настроить.
Корневой URL — это идентификатор вашего сервиса в строке адреса. Например, если мы назовем его Exchange, то путь к нему будет выглядеть как /BaseName/hs/Exchange/. Важно помнить, что префикс hs добавляется платформой автоматически для всех HTTP-сервисов.
Шаблоны URL позволяют определять параметры прямо в строке запроса. Рассмотрим пример шаблона для получения данных о товаре по его артикулу. Мы можем задать шаблон как /getItem/{Artikul}. В этом случае значение, переданное в фигурных скобках, будет доступно нам в коде 1С как параметр запроса.
Для каждого шаблона мы создаем методы (GET, POST, PUT, DELETE). Рассмотрим подробнее их назначение:
Разберем пример кода для метода GET, который возвращает информацию о номенклатуре. Проанализируем, как извлечь параметры из URL и сформировать ответ в формате JSON.
Функция getItemGET(Запрос)
// Извлекаем параметр из шаблона URL
Артикул = Запрос.ПараметрыURL.Получить("Artikul");
// Поиск товара в базе
СсылкаНаТовар = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Артикул);
Если СсылкаНаТовар.Пустая() Тогда
Возврат Новый HTTPСервисОтвет(404); // Товар не найден
КонецЕсли;
// Формируем структуру ответа
ДанныеТовара = Новый Структура;
ДанныеТовара.Вставить("Наименование", СсылкаНаТовар.Наименование);
ДанныеТовара.Вставить("Цена", СсылкаНаТовар.Цена);
// Сериализация в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеТовара);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Формируем HTTP-ответ
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Ответ.Заголовки.Вставить("Content-Type", "application/json");
Возврат Ответ;
КонецФункции
Теперь рассмотрим ситуацию, когда внешняя система присылает нам данные для загрузки. Выясним причину, почему важно проверять корректность входящего JSON. Для этого проанализируем работу с объектом ЧтениеJSON, а также проверку на заполненность обязательных полей в строке JSON.
Функция postData(Запрос)
// Читаем тело запроса
ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоЗапроса);
Попытка
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Исключение
Возврат Новый HTTPСервисОтвет(400); // Ошибка формата JSON
КонецПопытки;
// Пример обработки: создание записи в справочнике
НовыйОбъект = Справочники.ВнешниеСобытия.СоздатьЭлемент();
НовыйОбъект.Наименование = Данные.НаименованиеСобытия;
НовыйОбъект.Дата = ТекущаяДата();
НовыйОбъект.Записать();
Возврат Новый HTTPСервисОтвет(201); // Объект успешно создан
КонецФункции
Важным аспектом безопасности является проверка прав доступа. Платформа 1С поддерживает несколько видов авторизации для HTTP-сервисов: Basic Authentication и Anonymous. Кроме того, можно реализовать более сложные механизмы, такие как аутентификация по Access и Refresh токенам (JWT) стандартными средствами 1С. Рассмотрим, как проверить специфические заголовки запроса, используя свойство Запрос.Заголовки.
Для обеспечения безопасности мы можем передавать токен доступа в заголовках. Посмотрим на пример проверки ключа API:
КлючДоступа = Запрос.Заголовки.Получить("X-API-Key");
Если КлючДоступа <> "МойСекретныйТокен" Тогда
Ответ = Новый HTTPСервисОтвет(401);
Ответ.УстановитьТелоИзСтроки("Access Denied");
Возврат Ответ;
КонецЕсли;
Чтобы сервис стал доступен извне, его необходимо опубликовать на веб-сервере (Apache или IIS). В некоторых случаях может потребоваться специфическая публикация HTTP сервиса с использованием клиентского SSL сертификата. Выполним следующие шаги:
Важный момент: если вы используете файловую базу, помните, что веб-сервер запускает сеансы 1С от имени пользователя ОС, под которым запущен сервис веб-сервера. Проверьте права доступа к папке с базой данных.
Проанализируем способы ускорения работы наших сервисов. Поскольку каждое обращение к HTTP-сервису инициализирует сеанс (или использует существующий из пула соединений), следует минимизировать время выполнения кода внутри функции-обработчика. Для выстраивания надежных связей между базами можно применить собственный фреймворк для интеграции систем 1С, который значительно упрощает разработку.
Рассмотрим рекомендации по оптимизации:
default.vrd параметром poolSize.Таким образом, мы разобрали полный цикл создания HTTP-сервиса: от проектирования структуры URL до обработки сложных JSON-пакетов и настройки безопасности. Использование HTTPСервисЗапрос и HTTPСервисОтвет дает разработчику полный контроль над протоколом обмена, позволяя строить гибкие и масштабируемые интеграционные решения.