Современные требования к корпоративным системам подразумевают высокую степень связности. Одной из наиболее эффективных технологий обмена данными между 1С:Предприятие и внешними приложениями (сайтами, мобильными приложениями, другими базами данных) являются HTTP-сервисы. В рамках данной статьи мы подробно разберем, как реализовать собственный HTTP-сервис, настроить его структуру и написать эффективный код для обработки входящих запросов.
Прежде чем приступать к разработке, проанализируем ситуацию: нам необходимо организовать точку входа в систему 1С, которая будет принимать данные (например, заказы с сайта) в формате JSON и возвращать результат обработки. Использование HTTP-сервисов предпочтительнее классических SOAP-веб-сервисов (Web Services) из-за меньшего объема передаваемых данных (отсутствие избыточных XML-оберток) и высокой скорости работы.
Рассмотрим последовательность действий в конфигураторе:
ОбменСЗаказами.orders_api.Разберем подробнее структуру URL-шаблона. Шаблон определяет, по какому именно адресу будет доступен наш метод. Выясним причину, почему важно правильно именовать шаблоны: это влияет на читаемость API и удобство его поддержки.
Создадим шаблон с именем Заказ и шаблоном пути /v1/create/{ID}. Здесь часть {ID} в фигурных скобках является параметром, который мы сможем прочитать в коде.
Для каждого шаблона необходимо определить Методы. Чаще всего используются:
Теперь перейдем к самому важному — написанию кода в модуле HTTP-сервиса. Рассмотрим пример обработки POST-запроса, который принимает JSON с данными заказа.
Проанализируем структуру функции-обработчика. Она всегда принимает один параметр типа HTTPСервисЗапрос и должна возвращать объект типа HTTPСервисОтвет.
Функция ЗаказcreatePOST(Запрос)
// 1. Получаем тело запроса в виде строки
СтрокаJSON = Запрос.ПолучитьТелоКакСтроку();
// 2. Десериализация JSON в структуру 1С
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаJSON);
ДанныеЗаказа = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
// 3. Обработка данных (создание документа)
Попытка
НовыйЗаказ = Документы.ЗаказПокупателя.СоздатьДокумент();
НовыйЗаказ.Дата = ТекущаяДата();
НовыйЗаказ.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(ДанныеЗаказа.ИмяКлиента);
// Заполнение табличной части и других реквизитов...
НовыйЗаказ.Записать();
КодСостояния = 201; // Created
ОтветСтруктура = Новый Структура("status, message", "success", "Заказ успешно создан");
Исключение
КодСостояния = 500; // Internal Server Error
ОтветСтруктура = Новый Структура("status, error", "error", ОписаниеОшибки());
КонецПопытки;
// 4. Формирование ответа
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ОтветСтруктура);
Ответ = Новый HTTPСервисОтвет(КодСостояния);
Ответ.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть());
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Возврат Ответ;
КонецФункции
Рассмотрим подробнее, как извлечь параметры, которые мы указали в шаблоне (например, тот самый {ID}). Посмотрим на пример кода:
// Получение параметра из URL
Идентификатор = Запрос.ПараметрыURL.Получить("ID");
// Получение параметров запроса (после знака ?)
Токен = Запрос.ПараметрыЗапроса.Получить("token");
// Чтение заголовков (Headers)
ТипКонтента = Запрос.Заголовки.Получить("Content-Type");
Важно помнить, что заголовки позволяют передавать мета-информацию, например, ключи авторизации или формат данных. Выясним причину возможных ошибок: если не установить правильный заголовок Content-Type в ответе, принимающая сторона может некорректно интерпретировать полученную строку JSON.
Для того чтобы сервис стал доступен извне, базу необходимо опубликовать на веб-сервере (Apache или IIS). Выполним следующие действия:
ОбменСЗаказами.Для проверки работоспособности рекомендуется использовать сторонние утилиты, такие как Postman или curl. Адрес запроса будет выглядеть следующим образом: http://server_name/base_name/hs/orders_api/v1/create/123.
Разберем по шагам, как защитить наш HTTP-сервис:
Попытка...Исключение, чтобы возвращать клиенту понятный код ошибки (4xx или 5xx), а не пустой ответ.Проанализируем ситуацию с большими объемами данных: если планируется передача файлов или очень тяжелых JSON, рассмотрите возможность использования ДвоичныеДанные вместо строк для экономии оперативной памяти.
Таким образом, мы рассмотрели полный цикл создания HTTP-сервиса. Использование HTTPСервисЗапрос, HTTPСервисОтвет и встроенных функций работы с JSON делает 1С мощным инструментом для построения современных распределенных систем.