Как правильно создать и настроить HTTP-сервис в 1С 8.3 для обмена данными?

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

В современной разработке на платформе 1С:Предприятие 8.3 интеграция с внешними системами через HTTP-сервисы стала стандартом де-факто. В отличие от тяжеловесных SOAP-сервисов (Web-сервисов), HTTP-сервисы работают быстрее, проще в настройке и идеально подходят для взаимодействия с веб-сайтами и мобильными приложениями. Чтобы ускорить процесс разработки, можно использовать модуль с универсальными процедурами для быстрой организации и расширения API. В данной статье мы подробно разберем, как спроектировать, реализовать и отладить собственный HTTP-сервис.

Основы проектирования HTTP-сервиса

Прежде чем переходить к написанию кода, проанализируем структуру объекта HTTPСервис в дереве конфигурации. Каждый сервис состоит из трех ключевых элементов: Корневой URL, Шаблоны URL и Методы. Разберем по шагам, как их правильно настроить.

Корневой URL — это идентификатор вашего сервиса в строке адреса. Например, если мы назовем его Exchange, то путь к нему будет выглядеть как /BaseName/hs/Exchange/. Важно помнить, что префикс hs добавляется платформой автоматически для всех HTTP-сервисов.

Настройка шаблонов URL и методов

Шаблоны URL позволяют определять параметры прямо в строке запроса. Рассмотрим пример шаблона для получения данных о товаре по его артикулу. Мы можем задать шаблон как /getItem/{Artikul}. В этом случае значение, переданное в фигурных скобках, будет доступно нам в коде 1С как параметр запроса.

Для каждого шаблона мы создаем методы (GET, POST, PUT, DELETE). Рассмотрим подробнее их назначение:

  1. GET — используется исключительно для получения данных. По спецификации HTTP этот метод не должен менять состояние системы.
  2. POST — применяется для передачи данных в 1С (например, создание нового документа или загрузка остатков).
  3. PUT/PATCH — используются для обновления существующих данных.
  4. DELETE — для удаления объектов.

Реализация обработчика GET-запроса

Разберем пример кода для метода 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");
    
    Возврат Ответ;
КонецФункции

Обработка входящих данных в POST-запросе

Теперь рассмотрим ситуацию, когда внешняя система присылает нам данные для загрузки. Выясним причину, почему важно проверять корректность входящего 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. Перейдем в меню "Администрирование" -> "Публикация на веб-сервере".
  2. На закладке "HTTP-сервисы" установим флажок напротив нашего сервиса.
  3. Нажмем "Опубликовать".
  4. Для отладки и документирования API удобно использовать инструменты Swagger в 1С или внешние утилиты, такие как Postman.

Важный момент: если вы используете файловую базу, помните, что веб-сервер запускает сеансы 1С от имени пользователя ОС, под которым запущен сервис веб-сервера. Проверьте права доступа к папке с базой данных.

Оптимизация производительности

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

Рассмотрим рекомендации по оптимизации:

  1. Используйте Пул соединений. Это позволяет не тратить время на авторизацию и запуск сеанса при каждом запросе. Настройка выполняется в файле default.vrd параметром poolSize.
  2. Старайтесь не использовать тяжелые запросы к базе данных внутри HTTP-обработчика. Если данных много, лучше отдавать их порциями (пагинация).
  3. Для передачи больших объемов данных используйте сжатие (GZIP), если вызывающая сторона его поддерживает.

Таким образом, мы разобрали полный цикл создания HTTP-сервиса: от проектирования структуры URL до обработки сложных JSON-пакетов и настройки безопасности. Использование HTTPСервисЗапрос и HTTPСервисОтвет дает разработчику полный контроль над протоколом обмена, позволяя строить гибкие и масштабируемые интеграционные решения.

← На главную