В современной разработке на платформе 1С:Предприятие 8.3 интеграция через HTTP-сервисы стала стандартом де-факто. В отличие от тяжеловесного SOAP (Web-сервисов), HTTP-сервисы работают быстрее, используют меньше трафика и позволяют легко взаимодействовать с веб-сайтами, мобильными приложениями и другими сторонними API. Проанализируем, как реализовать этот механизм с нуля, разберем основные объекты платформы и напишем код для обработки входящих данных.
Разберем по шагам процесс создания объекта в конфигураторе. Прежде всего, нам необходимо добавить новый объект в ветке Общие — HTTP-сервисы. Рассмотрим ключевые свойства, которые необходимо заполнить:
api_integration).v1, то путь к сервису будет выглядеть как .../hs/v1/.После создания объекта необходимо настроить Шаблоны URL. Шаблон определяет, какую именно команду или ресурс запрашивает клиент. Разберем ситуацию: нам нужно получить список товаров. Мы создаем шаблон с именем GetItems и шаблоном /items. Если нам нужно передать конкретный ID товара, шаблон будет выглядеть так: /items/{id}.
Внутри каждого шаблона создаются Методы. Для каждого метода мы выбираем тип HTTP-запроса (GET, POST, PUT, DELETE) и указываем имя обработчика в модуле. Рассмотрим подробнее, как написать код для обработки простейшего GET-запроса.
Выясним причину, почему важно правильно формировать HTTPСервисОтвет. Если мы не вернем ответ, клиент получит ошибку 500. Посмотрим на пример кода в модуле сервиса:
Функция itemsGetItems(Запрос)
// Создаем объект ответа
Ответ = Новый HTTPСервисОтвет(200);
// Формируем структуру данных для возврата
Данные = Новый Структура;
Данные.Вставить("Status", "Success");
Данные.Вставить("Timestamp", ТекущаяДата());
// Сериализуем данные в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Данные);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Устанавливаем тело ответа и заголовки
Ответ.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
Ответ.Заголовки.Вставить("Content-Type", "application/json");
Возврат Ответ;
КонецФункции
Проанализируем ситуацию, когда внешняя система присылает нам данные для создания нового документа или записи в справочник. Для этого используется метод POST. Основная сложность здесь заключается в правильном чтении тела запроса, которое обычно приходит в формате JSON.
Разберем по шагам процесс обработки:
ПолучитьТелоКакСтроку().ЧтениеJSON для десериализации данных в Структура или Массив.Посмотрим на пример кода для обработки POST-запроса:
Функция itemsCreateItem(Запрос)
// Читаем тело запроса
ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку("UTF-8");
Если ПустаяСтрока(ТелоЗапроса) Тогда
Возврат Новый HTTPСервисОтвет(400); // Bad Request
КонецЕсли;
// Парсим JSON
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоЗапроса);
ДанныеОбъекта = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Создаем элемент справочника (пример)
Попытка
НовыйТовар = Справочники.Номенклатура.СоздатьЭлемент();
НовыйТовар.Наименование = ДанныеОбъекта.name;
НовыйТовар.Артикул = ДанныеОбъекта.sku;
НовыйТовар.Записать();
Ответ = Новый HTTPСервисОтвет(201);
Ответ.УстановитьТелоИзСтроки("Объект успешно создан", КодировкаТекста.UTF8);
Исключение
Ответ = Новый HTTPСервисОтвет(500);
Ответ.УстановитьТелоИзСтроки("Ошибка при записи: " + ОписаниеОшибки(), КодировкаТекста.UTF8);
КонецПопытки;
Возврат Ответ;
КонецФункции
Часто параметры передаются непосредственно в строке запроса, например: /hs/v1/items?category=electronics&limit=10. Проанализируем, как получить эти значения. Платформа 1С предоставляет доступ к ним через свойство Запрос.ПараметрыЗапроса, которое является объектом Соответствие.
Рассмотрим пример получения фильтра:
Категория = Запрос.ПараметрыЗапроса.Получить("category");
Если Категория <> Неопределено Тогда
// Используем переменную для фильтрации в запросе к БД
КонецЕсли;
Если же вы используете параметры внутри шаблона (например, /items/{id}), то значение id будет доступно через Запрос.ПараметрыURL.Получить("id"). Это критически важно для реализации RESTful-дизайна вашего API.
HTTP-сервисы в 1С по умолчанию требуют авторизации. Выясним, какие варианты доступны программисту:
default.vrd на веб-сервере.Authorization внутри кода метода. Если токен невалиден, возвращаем Новый HTTPСервисОтвет(401).Чтобы ваш сервис стал доступен внешнему миру, его нужно опубликовать на веб-сервере (IIS или Apache). Разберем этот процесс:
Администрирование — Публикация на веб-сервере.HTTP-сервисы установите флажок напротив вашего сервиса.default.vrd.После публикации адрес сервиса будет иметь формат: http://[server]/[base_name]/hs/[RootURL]/[Template]. Проанализируем это на примере: http://myserver/base/hs/v1/items.
Рассмотрим несколько практических советов для повышения стабильности работы системы:
ФоновыеЗадания.Выполнить(), а клиенту сразу возвращать статус 202 (Accepted) и ID задания.ЖурналРегистрации или отдельный регистр сведений. Это поможет быстро выяснить причину сбоя при интеграции.JSON, тем быстрее отработает сериализация и тем меньше нагрузка на сеть. Используйте Запрос с выборкой только нужных полей.Попытка...Исключение, чтобы внешняя система не получала "пустой" ответ или стандартную страницу ошибки веб-сервера.Таким образом, мы детально разобрали механизм работы с HTTP-сервисами в 1С. Этот инструмент позволяет строить гибкие и масштабируемые системы, объединяя 1С с любыми современными программными продуктами.