Современные системы автоматизации требуют высокой степени интеграции. В 1С:Предприятие 8.3 одним из наиболее эффективных способов взаимодействия с внешним миром являются HTTP-сервисы. В рамках данной статьи мы подробно разберем, как реализовать собственный REST-интерфейс на стороне 1С, настроить шаблоны URL и организовать передачу данных в формате JSON. Мы проанализируем основные методы обработки запросов и выясним причину типичных ошибок при их настройке.
Прежде чем переходить к коду, давайте разберем, как устроены HTTP-сервисы в платформе 1С. В отличие от SOAP (Web-сервисов), HTTP-сервисы работают напрямую с протоколом передачи гипертекста, что делает их более «легковесными» и быстрыми. Рассмотрим структуру объекта метаданных:
Проанализируем ситуацию: нам необходимо передать данные о товарах из 1С во внешнюю CRM-систему. Для этого мы создадим сервис, который будет принимать запросы и возвращать ответ в формате JSON.
Рассмотрим процесс создания объекта. В дереве метаданных перейдем в ветку «Общие» — «HTTP-сервисы». Создадим новый объект с именем ExchangeService. В поле «Корневой URL» укажем v1/exchange. Это означает, что адрес сервиса будет выглядеть примерно так: http://server/base/hs/v1/exchange.
Теперь разберем настройку шаблона URL. Добавим шаблон с именем GetItems и шаблоном /items/{Articul}. Фигурные скобки здесь означают параметр URL, который мы сможем получить в коде 1С. Рассмотрим подробнее: если отправить запрос на .../items/123, система поймет, что Articul равен "123".
Посмотрим на пример реализации кода для метода GET, который должен вернуть информацию о товаре по его артикулу. Нам нужно создать функцию в модуле HTTP-сервиса. Разберем по шагам, как это сделать:
Функция GetItemsGet(Запрос)
// Получаем параметр из URL
Артикул = Запрос.ПараметрыШаблонаURL.Получить("Articul");
// Ищем товар в базе
СсылкаНаТовар = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Артикул);
Если СсылкаНаТовар.Пустая() Тогда
Возврат Новый HTTPСервисОтвет(404); // Товар не найден
КонецЕсли;
// Формируем структуру для ответа
ДанныеТовара = Новый Структура;
ДанныеТовара.Вставить("Наименование", СсылкаНаТовар.Наименование);
ДанныеТовара.Вставить("Цена", СсылкаНаТовар.Цена);
// Сериализуем в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеТовара);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Возвращаем ответ
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Ответ.Заголовки.Вставить("Content-Type", "application/json");
Возврат Ответ;
КонецФункции
В данном примере мы использовали объект HTTPСервисЗапрос для получения входящих данных и HTTPСервисОтвет для отправки результата. Обратите внимание на важность установки правильного кода состояния (200 — успех, 404 — не найдено).
Теперь выясним причину, почему метод POST считается более сложным. В нем данные передаются не в URL, а в теле запроса (Body). Проанализируем ситуацию, когда внешняя система присылает нам данные для создания нового заказа. Нам необходимо прочитать ТелоЗапроса, преобразовать его из JSON в структуру 1С и выполнить запись в базу.
Разберем пример кода для метода POST:
Функция PostOrderPost(Запрос)
// Читаем тело запроса
СтрокаJSON = Запрос.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
ДанныеЗаказа = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Создаем документ в 1С
Попытка
НовыйЗаказ = Документы.ЗаказПокупателя.СоздатьДокумент();
НовыйЗаказ.Дата = ТекущаяДата();
// Заполнение реквизитов из структуры ДанныеЗаказа
// ...
НовыйЗаказ.Записать(РежимЗаписиДокумента.Запись);
Ответ = Новый HTTPСервисОтвет(201); // Created
Ответ.УстановитьТелоИзСтроки("Заказ успешно создан");
Исключение
Ответ = Новый HTTPСервисОтвет(500); // Ошибка сервера
Ответ.УстановитьТелоИзСтроки(ОписаниеОшибки());
КонецПопытки;
Возврат Ответ;
КонецФункции
Важный момент: при работе с HTTP-сервисами всегда используйте блок Попытка...Исключение. Если в коде произойдет необработанная ошибка, внешняя система получит невнятный ответ 500, и вы не сможете оперативно понять причину сбоя без анализа технологического журнала.
Чтобы ваш сервис стал доступен внешним потребителям, его необходимо опубликовать. Рассмотрим этот процесс подробнее:
ExchangeService.После этого сервис будет доступен по адресу вида http://[ИмяСервера]/[ИмяПубликации]/hs/v1/exchange/items/001. Для проверки работы мы рекомендуем использовать специализированные инструменты, такие как Postman или cURL.
Проанализируем аспекты безопасности. По умолчанию доступ к HTTP-сервисам требует авторизации (логин и пароль пользователя 1С). Вы можете использовать Basic Authentication, передавая закодированные данные в заголовке запроса. Однако для высоконагруженных систем стоит рассмотреть использование OpenID Connect или создание отдельного пользователя с минимальными правами доступа (только на чтение/запись необходимых объектов).
Также не забывайте про СеансовыеДанные. Каждый вызов HTTP-сервиса создает новый сеанс на сервере 1С. Чтобы избежать чрезмерного потребления лицензий и памяти, старайтесь делать запросы максимально компактными и быстрыми. Если вам нужно передать большой объем данных, лучше использовать асинхронную модель: сервис принимает запрос, ставит задачу в очередь (через РегламентныеЗадания) и сразу возвращает ответ 202 (Accepted).
Таким образом, мы по шагам разобрали создание полноценного HTTP-сервиса. Используя объекты ЧтениеJSON, ЗаписьJSON и методы HTTPСервисЗапрос, вы можете настроить гибкую и производительную интеграцию 1С с любыми современными приложениями.