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

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

Современные системы автоматизации требуют высокой степени интеграции. В 1С:Предприятие 8.3 одним из наиболее эффективных способов взаимодействия с внешним миром являются HTTP-сервисы. В рамках данной статьи мы подробно разберем, как реализовать собственный REST-интерфейс на стороне 1С, настроить шаблоны URL и организовать передачу данных в формате JSON. Мы проанализируем основные методы обработки запросов и выясним причину типичных ошибок при их настройке.

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

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

  1. Корневой URL — базовый адрес, по которому будет доступен ваш сервис.
  2. Шаблоны URL — правила, определяющие, какой метод будет вызван при обращении к конкретному адресу.
  3. Методы — стандартные операции HTTP (GET, POST, PUT, DELETE), привязанные к шаблонам.

Проанализируем ситуацию: нам необходимо передать данные о товарах из 1С во внешнюю CRM-систему. Для этого мы создадим сервис, который будет принимать запросы и возвращать ответ в формате JSON.

Шаг 1. Создание и настройка объекта в конфигураторе

Рассмотрим процесс создания объекта. В дереве метаданных перейдем в ветку «Общие» — «HTTP-сервисы». Создадим новый объект с именем ExchangeService. В поле «Корневой URL» укажем v1/exchange. Это означает, что адрес сервиса будет выглядеть примерно так: http://server/base/hs/v1/exchange.

Теперь разберем настройку шаблона URL. Добавим шаблон с именем GetItems и шаблоном /items/{Articul}. Фигурные скобки здесь означают параметр URL, который мы сможем получить в коде 1С. Рассмотрим подробнее: если отправить запрос на .../items/123, система поймет, что Articul равен "123".

Шаг 2. Реализация метода GET для получения данных

Посмотрим на пример реализации кода для метода 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 — не найдено).

Шаг 3. Обработка входящих данных (метод POST)

Теперь выясним причину, почему метод POST считается более сложным. В нем данные передаются не в URL, а в теле запроса (Body). Проанализируем ситуацию, когда внешняя система присылает нам данные для создания нового заказа. Нам необходимо прочитать ТелоЗапроса, преобразовать его из JSON в структуру 1С и выполнить запись в базу.

Разберем пример кода для метода POST:


Функция PostOrderPost(Запрос)
    
    // Читаем тело запроса
    СтрокаJSON = Запрос.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
    ДанныеЗаказа = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    // Создаем документ в 1С
    Попытка
        НовыйЗаказ = Документы.ЗаказПокупателя.СоздатьДокумент();
        НовыйЗаказ.Дата = ТекущаяДата();
        // Заполнение реквизитов из структуры ДанныеЗаказа
        // ...
        НовыйЗаказ.Записать(РежимЗаписиДокумента.Запись);
        
        Ответ = Новый HTTPСервисОтвет(201); // Created
        Ответ.УстановитьТелоИзСтроки("Заказ успешно создан");
    Исключение
        Ответ = Новый HTTPСервисОтвет(500); // Ошибка сервера
        Ответ.УстановитьТелоИзСтроки(ОписаниеОшибки());
    КонецПопытки;
    
    Возврат Ответ;
    
КонецФункции

Важный момент: при работе с HTTP-сервисами всегда используйте блок Попытка...Исключение. Если в коде произойдет необработанная ошибка, внешняя система получит невнятный ответ 500, и вы не сможете оперативно понять причину сбоя без анализа технологического журнала.

Шаг 4. Публикация сервиса на веб-сервере

Чтобы ваш сервис стал доступен внешним потребителям, его необходимо опубликовать. Рассмотрим этот процесс подробнее:

  1. Установите веб-сервер (Apache или IIS).
  2. В конфигураторе 1С выберите меню «Администрирование» — «Публикация на веб-сервере».
  3. На вкладке «HTTP-сервисы» установите флажок напротив вашего сервиса ExchangeService.
  4. Нажмите «Опубликовать».

После этого сервис будет доступен по адресу вида http://[ИмяСервера]/[ИмяПубликации]/hs/v1/exchange/items/001. Для проверки работы мы рекомендуем использовать специализированные инструменты, такие как Postman или cURL.

Советы по оптимизации и безопасности

Проанализируем аспекты безопасности. По умолчанию доступ к HTTP-сервисам требует авторизации (логин и пароль пользователя 1С). Вы можете использовать Basic Authentication, передавая закодированные данные в заголовке запроса. Однако для высоконагруженных систем стоит рассмотреть использование OpenID Connect или создание отдельного пользователя с минимальными правами доступа (только на чтение/запись необходимых объектов).

Также не забывайте про СеансовыеДанные. Каждый вызов HTTP-сервиса создает новый сеанс на сервере 1С. Чтобы избежать чрезмерного потребления лицензий и памяти, старайтесь делать запросы максимально компактными и быстрыми. Если вам нужно передать большой объем данных, лучше использовать асинхронную модель: сервис принимает запрос, ставит задачу в очередь (через РегламентныеЗадания) и сразу возвращает ответ 202 (Accepted).

Таким образом, мы по шагам разобрали создание полноценного HTTP-сервиса. Используя объекты ЧтениеJSON, ЗаписьJSON и методы HTTPСервисЗапрос, вы можете настроить гибкую и производительную интеграцию 1С с любыми современными приложениями.

← На главную